Preliminaries

Load packages.

library(tidyverse)
library(rstan)
library(tidybayes)
library(patchwork)

Set Stan options:

options(mc.cores = parallel::detectCores()) # parallel proc
rstan_options(auto_write = TRUE) # avoid recompilation

Import data

data_raw <- read_csv("data/2023-01-21.csv")
Rows: 1137 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (7): term, phase, filename, course, race, gender, grade
dbl (3): cohort, faculty, count
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Wrangle data

Remove unneeded variables.

d <- data_raw %>%
    select(-filename, -term, -cohort, -course) %>%
    arrange(faculty)
d$faculty <- as_factor(d$faculty)
d
d %>%
  group_by(faculty) %>%
  count()

Duplicate rows

Duplicate rows according to count variable to create one row per student.

d_all <- d %>%
    uncount(count)
d_all

Check that there are the correct number of rows:

sum(d$count)
[1] 3632
NROW(d_all)
[1] 3632

Drop missing race data

Some of the race data is missing, so we have to drop those rows.

NROW(d_all)
[1] 3632
d_all <- d_all %>%
  drop_na()
NROW(d_all)
[1] 3416

Combine phases

d_all$phase_coll <- d_all$phase %>%
    fct_collapse("1" = c("1a", "1b"), "2" = "2a", "3" = c("3a", "3b"))
table(d_all$phase)

  1a   1b   2a   3a   3b 
 660  863 1024  529  340 
table(d_all$phase_coll)

   1    2    3 
1523 1024  869 

Collapse “failing” grades

d_all$grade_coll <- d_all$grade %>%
    fct_collapse(DFW = c("D", "F", "W"))
table(d_all$grade)

   A    B    C    D    F    W 
1095  829  538  254  298  402 
table(d_all$grade_coll)

   A    B    C  DFW 
1095  829  538  954 

We’ll also need this variable as a sequence of numbers:

d_all <- d_all %>%
    mutate(grade_ord = as.integer(grade_coll))
table(d_all$grade_ord)

   1    2    3    4 
1095  829  538  954 

Collapse race variable

d_all <- d_all %>%
  mutate(race_coll = ifelse(race == "nonURM", "White or Asian", "Black, Hispanic, or Indigenous"))
table(d_all$race)

 amerind    black hispanic   natpac   nonURM 
      17      514      429       13     2443 
table(d_all$race_coll)

Black, Hispanic, or Indigenous                 White or Asian 
                           973                           2443 

Create index variables for phases, faculty, gender, and race

Phase

The phase indicator has to be 1 or 2. Phase 1 will always be 1, but in the two different models, the comparison phase is either Phase 2 or Phase 3. Both will need to be labeled with the index 2.

d_all <- d_all %>%
  mutate(phase_ind = ifelse(phase_coll == 1, 1, 2))
table(d_all$phase_coll)

   1    2    3 
1523 1024  869 
table(d_all$phase_ind)

   1    2 
1523 1893 

Faculty

Currently, the faculty are numbered as follows:

table(d_all$faculty)

  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
 81 156 122 171  92 224 326 155 180 690 100  47  48  34  84  80  19  37  41  36 
 21  22  23  24  25 
 39  89 252 264  49 

The faculty is a factor variable, but we’ll also need an integer version. We’ll also drop the unused levels (faculty with no race data at all).

table(d_all$faculty)

  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
 81 156 122 171  92 224 326 155 180 690 100  47  48  34  84  80  19  37  41  36 
 21  22  23  24  25 
 39  89 252 264  49 
d_all$faculty <- fct_drop(d_all$faculty)
d_all <- d_all %>%
  mutate(faculty_ind = as.integer(as_factor(faculty)))
table(d_all$faculty_ind)

  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
 81 156 122 171  92 224 326 155 180 690 100  47  48  34  84  80  19  37  41  36 
 21  22  23  24  25 
 39  89 252 264  49 

Gender

levels(as_factor(d_all$gender))
[1] "men"   "women"

So in the index variable, 1 = “men” and 2 = “women”.

d_all <- d_all %>%
  mutate(gender_ind = as.integer(as_factor(gender)))
table(d_all$gender)

  men women 
 2561   855 
table(d_all$gender_ind)

   1    2 
2561  855 

Race

levels(as_factor(d_all$race_coll))
[1] "White or Asian"                 "Black, Hispanic, or Indigenous"

So in the index variable, 1 = “White or Asian”, 2 = “Black, Hispanic, or Indigenous”.

d_all <- d_all %>%
  mutate(race_ind = as.integer(as_factor(race_coll)))
table(d_all$race_coll)

Black, Hispanic, or Indigenous                 White or Asian 
                           973                           2443 
table(d_all$race_ind)

   1    2 
2443  973 

Interaction terms

Phase_gender

The new phase_gender variable is indexed as follows:

  1. Phase 1, Men
  2. Phase 1, Women
  3. Phase 2/3, Men
  4. Phase 2/3, Women
d_all <- d_all %>%
  mutate(phase_gender = case_when(phase_ind == 1 & gender_ind == 1 ~ 1,
                                  phase_ind == 1 & gender_ind == 2 ~ 2,
                                  phase_ind == 2 & gender_ind == 1 ~ 3,
                                  phase_ind == 2 & gender_ind == 2 ~ 4))
table(d_all$phase_ind, d_all$gender)
   
     men women
  1 1164   359
  2 1397   496
table(d_all$phase_gender)

   1    2    3    4 
1164  359 1397  496 

Phase_race

The new phase_race variable is indexed as follows:

  1. Phase 1, White or Asian
  2. Phase 1, Black, Hispanic, or Indigenous
  3. Phase 2/3, White or Asian
  4. Phase 2/3, Black, Hispanic, or Indigenous
d_all <- d_all %>%
  mutate(phase_race = case_when(phase_ind == 1 & race_ind == 1 ~ 1,
                                phase_ind == 1 & race_ind == 2 ~ 2,
                                phase_ind == 2 & race_ind == 1 ~ 3,
                                phase_ind == 2 & race_ind == 2 ~ 4))
table(d_all$phase_ind, d_all$race_coll)
   
    Black, Hispanic, or Indigenous White or Asian
  1                            398           1125
  2                            575           1318
table(d_all$phase_race)

   1    2    3    4 
1125  398 1318  575 

Complete data set

d_all

Exploratory data analysis

Gender

ggplot(d_all, aes(x = gender)) +
    geom_bar()

Race

ggplot(d_all, aes(x = race)) +
    geom_bar()

ggplot(d_all, aes(x = race_coll)) +
    geom_bar()

Grade distributions

All letter grades

All grades given across the entire study:

ggplot(d_all, aes(x = grade)) +
    geom_bar()

Overall grade distributions for each phase

ggplot(d_all, aes(x = grade)) +
    geom_bar() +
    facet_grid(phase ~ .)

As proportions within each phase:

d_all %>%
    group_by(phase, grade) %>%
    count() %>%
    group_by(phase) %>%
    mutate(prop = n/sum(n)) %>%
    ggplot(aes(x = grade, y = prop)) +
        geom_bar(stat = "identity") +
        facet_grid(phase ~ .)

Grade distributions by faculty across phases

ggplot(d_all, aes(x = grade)) +
    geom_bar() +
    facet_grid(phase ~ faculty)

As proportions:

d_all %>%
    group_by(phase, faculty, grade) %>%
    count() %>%
    group_by(phase, faculty) %>%
    mutate(prop = n/sum(n)) %>%
    ggplot(aes(x = grade, y = prop)) +
        geom_bar(stat = "identity") +
        facet_grid(phase ~ faculty)

Grade distributions by gender

ggplot(d_all, aes(x = grade_coll)) +
    geom_bar() +
    facet_grid(phase_coll ~ gender)

As proportions:

d_all %>%
    group_by(phase_coll, gender, grade_coll) %>%
    count() %>%
    group_by(phase_coll, gender) %>%
    mutate(prop = n/sum(n)) %>%
    ggplot(aes(x = grade_coll, y = prop)) +
        geom_bar(stat = "identity") +
        facet_grid(phase_coll ~ gender)

Check the numbers:

Phase 1 to Phase 2:

d_all %>%
    filter(phase_coll == 1 | phase_coll == 2) %>%
    group_by(grade_coll, gender, phase_coll) %>%
    count() %>%
    group_by(phase_coll, gender) %>%
    mutate(prop = n/sum(n))
d_all %>%
    filter(phase_coll == 1 | phase_coll == 2) %>%
    group_by(grade_coll, gender, phase_coll) %>%
    count() %>%
    group_by(phase_coll, gender) %>%
    mutate(prop = n/sum(n)) %>%
  ggplot(aes(y = prop, x = phase_coll)) +
    geom_point() +
    facet_grid(gender ~ grade_coll)

Phase 1 to Phase 3:

d_all %>%
    filter(phase_coll == 1 | phase_coll == 3) %>%
    group_by(grade_coll, gender, phase_coll) %>%
    count() %>%
    group_by(phase_coll, gender) %>%
    mutate(prop = n/sum(n))
d_all %>%
    filter(phase_coll == 1 | phase_coll == 3) %>%
    group_by(grade_coll, gender, phase_coll) %>%
    count() %>%
    group_by(phase_coll, gender) %>%
    mutate(prop = n/sum(n)) %>%
  ggplot(aes(y = prop, x = phase_coll)) +
    geom_point() +
    facet_grid(gender ~ grade_coll)

Grade distributions by race

ggplot(d_all, aes(x = grade_coll)) +
    geom_bar() +
    facet_grid(phase_coll ~ race_coll)

As proportions:

d_all %>%
    group_by(phase_coll, race_coll, grade_coll) %>%
    count() %>%
    group_by(phase_coll, race_coll) %>%
    mutate(prop = n/sum(n)) %>%
    ggplot(aes(x = grade_coll, y = prop)) +
        geom_bar(stat = "identity") +
        facet_grid(phase_coll ~ race_coll)

Check the numbers:

Phase 1 to Phase 2:

d_all %>%
    filter(phase_coll == 1 | phase_coll == 2) %>%
    group_by(grade_coll, race_coll, phase_coll) %>%
    count() %>%
    group_by(phase_coll, race_coll) %>%
    mutate(prop = n/sum(n))
d_all %>%
    filter(phase_coll == 1 | phase_coll == 2) %>%
    group_by(grade_coll, race_coll, phase_coll) %>%
    count() %>%
    group_by(phase_coll, race_coll) %>%
    mutate(prop = n/sum(n)) %>%
  ggplot(aes(y = prop, x = phase_coll)) +
    geom_point() +
    facet_grid(race_coll ~ grade_coll)

Phase 1 to Phase 3:

d_all %>%
    filter(phase_coll == 1 | phase_coll == 3) %>%
    group_by(grade_coll, race_coll, phase_coll) %>%
    count() %>%
    group_by(phase_coll, race_coll) %>%
    mutate(prop = n/sum(n))
d_all %>%
    filter(phase_coll == 1 | phase_coll == 3) %>%
    group_by(grade_coll, race_coll, phase_coll) %>%
    count() %>%
    group_by(phase_coll, race_coll) %>%
    mutate(prop = n/sum(n)) %>%
  ggplot(aes(y = prop, x = phase_coll)) +
    geom_point() +
    facet_grid(race_coll ~ grade_coll)

Filter data for phase analysis

# Phase 1 and Phase 2 data
d_final_12 <- d_all %>%
  filter(as.integer(phase_coll) == 1 | as.integer(phase_coll) == 2)

# Only faculty labeled 1-11 have Phase 3 data
d_final_13 <- d_all %>%
  filter(as.integer(phase_coll) == 1 | as.integer(phase_coll) == 3) %>%
  filter(as.integer(faculty) >= 1 & as.integer(faculty) <= 11)

Drop unused levels of phase_coll and faculty:

d_final_12$phase_coll <- fct_drop(d_final_12$phase_coll)
d_final_13$phase_coll <- fct_drop(d_final_13$phase_coll)
d_final_12$faculty <- fct_drop(d_final_12$faculty)
d_final_13$faculty <- fct_drop(d_final_13$faculty)

Final data sets

d_final_12
str(d_final_12)
tibble [2,547 × 15] (S3: tbl_df/tbl/data.frame)
 $ phase       : chr [1:2547] "1a" "1a" "1a" "1a" ...
 $ faculty     : Factor w/ 25 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ race        : chr [1:2547] "nonURM" "nonURM" "nonURM" "nonURM" ...
 $ gender      : chr [1:2547] "men" "men" "men" "men" ...
 $ grade       : chr [1:2547] "A" "A" "A" "A" ...
 $ phase_coll  : Factor w/ 2 levels "1","2": 1 1 1 1 1 1 1 1 1 1 ...
 $ grade_coll  : Factor w/ 4 levels "A","B","C","DFW": 1 1 1 1 1 1 1 1 2 2 ...
 $ grade_ord   : int [1:2547] 1 1 1 1 1 1 1 1 2 2 ...
 $ race_coll   : chr [1:2547] "White or Asian" "White or Asian" "White or Asian" "White or Asian" ...
 $ phase_ind   : num [1:2547] 1 1 1 1 1 1 1 1 1 1 ...
 $ faculty_ind : int [1:2547] 1 1 1 1 1 1 1 1 1 1 ...
 $ gender_ind  : int [1:2547] 1 1 1 1 1 2 2 2 1 1 ...
 $ race_ind    : int [1:2547] 1 1 1 1 1 1 1 1 1 1 ...
 $ phase_gender: num [1:2547] 1 1 1 1 1 2 2 2 1 1 ...
 $ phase_race  : num [1:2547] 1 1 1 1 1 1 1 1 1 1 ...
d_final_13
str(d_final_13)
tibble [1,748 × 15] (S3: tbl_df/tbl/data.frame)
 $ phase       : chr [1:1748] "1a" "1a" "1a" "1a" ...
 $ faculty     : Factor w/ 11 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ race        : chr [1:1748] "nonURM" "nonURM" "nonURM" "nonURM" ...
 $ gender      : chr [1:1748] "men" "men" "men" "men" ...
 $ grade       : chr [1:1748] "A" "A" "A" "A" ...
 $ phase_coll  : Factor w/ 2 levels "1","3": 1 1 1 1 1 1 1 1 1 1 ...
 $ grade_coll  : Factor w/ 4 levels "A","B","C","DFW": 1 1 1 1 1 1 1 1 2 2 ...
 $ grade_ord   : int [1:1748] 1 1 1 1 1 1 1 1 2 2 ...
 $ race_coll   : chr [1:1748] "White or Asian" "White or Asian" "White or Asian" "White or Asian" ...
 $ phase_ind   : num [1:1748] 1 1 1 1 1 1 1 1 1 1 ...
 $ faculty_ind : int [1:1748] 1 1 1 1 1 1 1 1 1 1 ...
 $ gender_ind  : int [1:1748] 1 1 1 1 1 2 2 2 1 1 ...
 $ race_ind    : int [1:1748] 1 1 1 1 1 1 1 1 1 1 ...
 $ phase_gender: num [1:1748] 1 1 1 1 1 2 2 2 1 1 ...
 $ phase_race  : num [1:1748] 1 1 1 1 1 1 1 1 1 1 ...

Final summary tables

table(d_all$gender, d_all$race)
       
        amerind black hispanic natpac nonURM
  men        14   366      321     11   1849
  women       3   148      108      2    594
table(d_final_12$race_coll, d_final_12$gender, d_final_12$phase_ind)
, ,  = 1

                                
                                 men women
  Black, Hispanic, or Indigenous 294   104
  White or Asian                 870   255

, ,  = 2

                                
                                 men women
  Black, Hispanic, or Indigenous 210    81
  White or Asian                 542   191
table(d_final_12$race_coll, d_final_12$gender, d_final_12$phase_ind) %>%
  prop.table(margin = 3)
, ,  = 1

                                
                                        men      women
  Black, Hispanic, or Indigenous 0.19304005 0.06828628
  White or Asian                 0.57124097 0.16743270

, ,  = 2

                                
                                        men      women
  Black, Hispanic, or Indigenous 0.20507812 0.07910156
  White or Asian                 0.52929688 0.18652344
table(d_final_13$race_coll, d_final_13$gender, d_final_13$phase_ind)
, ,  = 1

                                
                                 men women
  Black, Hispanic, or Indigenous 170    54
  White or Asian                 514   141

, ,  = 2

                                
                                 men women
  Black, Hispanic, or Indigenous 208    76
  White or Asian                 437   148
table(d_final_13$race_coll, d_final_13$gender, d_final_13$phase_ind) %>%
  prop.table(margin = 3)
, ,  = 1

                                
                                        men      women
  Black, Hispanic, or Indigenous 0.19340159 0.06143345
  White or Asian                 0.58475540 0.16040956

, ,  = 2

                                
                                        men      women
  Black, Hispanic, or Indigenous 0.23935558 0.08745685
  White or Asian                 0.50287687 0.17031070

Models

The ordinal regression model assumes a continuous latent distribution for the response variable with “cutpoints” that generate ordinal categories. For grades, this makes a lot of sense, as the continuous distribution of points is converted into discrete ordered grades.

Suppose there are \(K > 2\) categories in our ordinal response \(Y\). (For the grade data, \(K = 4\).) Let \(c\) be a vector of length \(K + 1\) with \(c_{0} = -\infty\), \(c_{K} = \infty\), and \(c_{1} < c_{2} < \dots < c_{K-1}\). Finally, let \(\eta\) be a real number. Then for \(1 \leq k \leq K\), the ordered logistic distribution is given by

\[ OrdLog(k \mid \eta, c) = invlogit(\eta - c_{k - 1}) - invlogit(\eta - c_{k}) \] where \(invlogit\) is the inverse logit function (sometimes called the logistic function):

\[ invlogit(x) = \frac{e^{x}}{1 + e^{x}}. \]

Note that \(invlogit(-\infty) = 0\) and \(invlogit(\infty) = 1\).

\(OrdLog(k \mid \eta, c)\) is the probability (given the model) of the ordinal response variable taking the value \(k\): \(Pr(Y = k)\). (Although \(Y\) consists of ordered categories, these categories are assigned integers for convenience in writing down the model mathematically. The model does not assume that the categories are equally spaced.)

This is not the most natural parameterization of the ordinal regression model, but it’s the one Stan uses, so we’re stuck with it. We can re-express the model other ways that are easier to understand. First, note that the inverse logit function represents the cumulative probability of a logistic distributed random variable \(X\); in other words,

\[ invlogit(x) = Pr(X \leq x) \] where \[ X \sim Logistic(0, 1). \]

Replacing \(x\) with \(\eta - c_{k-1}\) and using the identity \(invlogit(-x) = 1 - invlogit(x)\):

\[\begin{align*} Pr(Y = k) &= invlogit(\eta - c_{k - 1}) - invlogit(\eta - c_{k}) \\ &= \left( 1 - invlogit(c_{k - 1} - \eta) \right) - \left( 1 - invlogit(c_{k} - \eta) \right) \\ &= invlogit(c_{k} - \eta) - invlogit(c_{k - 1} - \eta) \end{align*}\]

One can show (either using algebra and the expression above, or thinking about \(invlogit\) as a cumulative probability) that

\[ Pr(Y \leq k) = invlogit(c_{k} - \eta) \]

Taking the logit function (log odds) on both sides, we get an equivalent expression representing a linear model predicting the cumulative log odds of the ordinal response, meaning the log odds of being in category \(k\) or lower.

\[ logit(Pr(Y \leq k)) = \log\left( \frac{Pr(Y \leq k)}{Pr(Y > k)} \right) = c_{k} - \eta \]

Based on the way grades are parameterized, however, lower values of \(k\) are actually better grades. For example, the event \(Y \leq 2\) refers to grades of B or A.

The effect of \(\eta\) is as follows: if \(\eta > 0\), then the log odds—and, therefore, the probability—of being in category \(k\) or lower (meaning higher grades) will be smaller. This shifts probability to higher-numbered categories. In other words, larger values of \(\eta\) will correspond to more probability assigned to higher-numbered categories of the response (corresponding to lower grades). Likewise, negative values of \(\eta\) will shift more probability onto the lower-numbered categories (higher grades). One important point to make is that \(\eta\) does not depend on \(k\). The “shift” in log-odds is assumed by the model to be constant across all values of \(k\). This is called the “proportional odds” assumption due to the following equation:

\[ \frac{Pr(Y \leq k)}{Pr(Y > k)} = e^{(c_{k} - \eta)} = e^{c_{k}} e^{\eta} \]

In general, predictors in the model will be incorporated into the \(\eta\) term. In this data, we have the following parameters coded as index variables (one variable for each group in the data):

  • \(\alpha_{faculty}\): Each faculty participant has a parameter. These are so called “random effects” and are modeled hierarchically using a normal hyperprior: \(\alpha \sim Normal(\bar{\alpha}, \sigma)\). The result will be a partial pooling of the results across faculty.
  • \(\beta_{phase}\): Each phase has a parameter. There are two phases. In one model, they are Phase 1 and Phase 2. In the other model, they are Phase 1 and Phase 3.
  • \(\gamma_{gender}\): Genders are “men” and “women”.
  • \(\rho_{race}\): Racial categories are “Black, Hispanic, or Indigenous” and “White or Asian”.
  • \(\delta_{phase/gender}\): These are interaction terms that model deviations from the main effects for phase and gender. (There are four such terms, one for each combination of phase and gender.)
  • \(\zeta_{phase/race}\): These are interaction terms that model deviations from the main effects for phase and race. (There are four such terms, one for each combination of phase and race.)

There are two models we are considering. The first model (Model A) uses

\[ \eta = \alpha_{faculty} + \beta_{phase} \]

This model will measure the average effect between phases and will allow us to summarize inferences about grade changes for individual faculty and for all faculty collectively.

The second model (Model B) will consider all predictors, incorporating race and gender, including interaction terms with phase:

\[ \eta = \alpha_{faculty} + \beta_{phase} + \gamma_{gender} + \rho_{race} + \delta_{phase/gender} + \zeta_{phase/race} \]

Model B will measure differences between gender and race categories. In theory, it should be possible to recover Model A from Model B by marginalizing over gender and race. However, the parameterization of the interaction terms in Model B makes it computationally difficult to perform that marginalization. Therefore, we opt to run both Model A and Model B.

Suppose that \(Y_{1}\) is the ordinal response (grades) for Phase 1 and \(Y_{j}\) is the ordinal response for either Phase 2 or Phase 3 (\(j = 2 \text{ or } 3\)). For each cutpoint \(c_{k}\):

\[ \eta = c_{k} - logit(Pr(Y \leq k)). \]

In Model A, we then have the following equations (for all faculty):

\[\begin{align*} \beta_{1} &= c_{k} - \alpha_{faculty} - logit(Pr(Y_{1} \leq k)) \\ \beta_{j} &= c_{k} - \alpha_{faculty} - logit(Pr(Y_{j} \leq k)) \end{align*}\]

We can subtract these two equations to obtain

\[\begin{align*} \beta_{1} - \beta_{j} &= logit(Pr(Y_{j} \leq k)) - logit(Pr(Y_{1} \leq k)) \\ &= log\left( \frac{Pr(Y_{j} \leq k)}{Pr(Y_{j} > k)} \right) - log\left( \frac{Pr(Y_{1} \leq k)}{Pr(Y_{1} > k)} \right) \\ &= log\left( \frac{Pr(Y_{j} \leq k)/Pr(Y_{j} > k)}{Pr(Y_{1} \leq k)/Pr(Y_{1} > k)} \right) \end{align*}\]

Therefore, we can exponentiate the expression on the left to get the odds ratio from Phase 1 to Phase 2/3.

An odds ratio of 1 indicates that the grade distribution does not change from one phase to the next. An odds ratio greater than 1 indicates that grades improved from Phase 1 to Phase \(j\). An odds ratio less than 1 indicates that grades decreased from Phase 1 to Phase \(j\). The proportional odds assumption forces this odds ratio to be the same at all grade levels. Although this is rarely a realistic assumption, the model effectively averages over any differences from one grade level to the next to enforce this assumption.

In Model B, we have the following equations for each value of faculty, gender, and race:

\[\begin{align*} \beta_{1} + \delta_{1/gender} + \zeta_{1/race} &= c_{k} - \alpha_{faculty} - \gamma_{gender} - \rho_{race} - logit(Pr(Y_{1} \leq k)) \\ \beta_{j} + \delta_{j/gender} + \zeta_{j/race} &= c_{k} - \alpha_{faculty} - \gamma_{gender} - \rho_{race} - logit(Pr(Y_{j} \leq k)) \end{align*}\]

We can subtract these two equations to obtain

\[\begin{align*} \beta_{1} - \beta_{j} + \delta_{1/gender} - \delta_{j/gender} + \zeta_{1/race} - \zeta_{j/race} &= logit(Pr(Y_{j} \leq k)) - logit(Pr(Y_{1} \leq k)) \\ &= log\left( \frac{Pr(Y_{j} \leq k)}{Pr(Y_{j} > k)} \right) - log\left( \frac{Pr(Y_{1} \leq k)}{Pr(Y_{1} > k)} \right) \\ &= log\left( \frac{Pr(Y_{j} \leq k)/Pr(Y_{j} > k)}{Pr(Y_{1} \leq k)/Pr(Y_{1} > k)} \right) \end{align*}\]

Just as before, we can exponentiate the expression on the left to get the odds ratio from Phase 1 to Phase 2/3 for but now for any combination of gender and race.

As this is a Bayesian analysis, we must specify priors for all parameters. We choose fairly generic, weakly-informative priors. As they are centered at 0, they will also serve as regularizing priors. (The data is sufficient in this study that they will overwhelm just about any sensible choice of prior.) The priors are as follows:

\[\begin{align*} \alpha_{faculty} &\sim Normal(\bar{\alpha}, \sigma) \\ \bar{\alpha} &\sim Normal(0, 1) \\ \sigma &\sim Exponential(1) \\ \beta_{phase} &\sim Normal(0, 1) \\ \gamma_{gender} &\sim Normal(0, 1) \\ \rho_{race} &\sim Normal(0, 1) \\ \delta_{phase/gender} &\sim Normal(0, 1) \\ \zeta_{phase/race} &\sim Normal(0, 1) \\ \end{align*}\]

The components of the cutpoint vector are each assigned a uniform prior by Stan (which is truncated based on the constraints in the ordering).

Multilevel models in Stan

Model A

data {
  int<lower=0> N;                     // sample size
  int<lower=1, upper=2> phase_ind[N]; // two phases
  int<lower=2> J;                     // number of faculty
  int<lower=1> faculty_ind[N];        // faculty array
  int<lower=2> K;                     // number of grade categ.
  int<lower=1, upper=K> y[N];         // grade codes
}
parameters {
  real alpha_bar;
  real<lower=0> sigma;
  real alpha[J];
  real beta[2];
  ordered[K - 1] c;
}
model {
  alpha_bar ~ normal(0, 1);
  sigma ~ exponential(1);
  alpha ~ normal(alpha_bar, sigma);
  beta ~ normal(0, 1);
  for (n in 1:N) {
    real eta;
    eta = alpha[faculty_ind[n]] + beta[phase_ind[n]];
    y[n] ~ ordered_logistic(eta, c);
  }
}
Phase 1 to Phase 2

The data list:

ord_mm_dataA_12 <- list(
    N = NROW(d_final_12),              
    phase_ind = d_final_12$phase_ind,
    J = nlevels(d_final_12$faculty),  
    faculty_ind = d_final_12$faculty_ind,
    K = nlevels(d_final_12$grade_coll), 
    y = d_final_12$grade_ord
)

Fit the model:

ord_mm_fitA_12 <- sampling(ord_mm_modelA,
                           data = ord_mm_dataA_12,
                           iter = 8000,
                           seed = 11114)

Coefficients of the model:

summary(ord_mm_fitA_12, pars = c("alpha_bar", "sigma", "alpha", "beta"))$summary
                  mean     se_mean        sd       2.5%         25%         50%
alpha_bar  0.029001437 0.029786871 0.9536399 -1.8069434 -0.61646407  0.03504065
sigma      0.670315464 0.001652577 0.1135559  0.4842918  0.59108139  0.65850768
alpha[1]   0.075343637 0.030426792 0.9847952 -1.8417903 -0.58778038  0.07961142
alpha[2]  -0.102168317 0.030316231 0.9756223 -1.9931740 -0.75341640 -0.10033212
alpha[3]   0.437905864 0.030466097 0.9829083 -1.4700580 -0.21648871  0.44384830
alpha[4]   1.517049244 0.030286087 0.9773438 -0.3752865  0.85733245  1.51134438
alpha[5]   0.834573605 0.030410173 0.9814089 -1.0883020  0.16892742  0.83439434
alpha[6]   0.591165648 0.030373492 0.9747921 -1.2891085 -0.06682071  0.59204394
alpha[7]   0.240242682 0.030385629 0.9695838 -1.6472710 -0.40941128  0.23948115
alpha[8]   0.476283274 0.030259333 0.9762928 -1.4037574 -0.16916571  0.47107418
alpha[9]  -0.412525274 0.030381400 0.9836608 -2.3279657 -1.06832987 -0.40997261
alpha[10] -0.009407759 0.030430601 0.9687638 -1.8676814 -0.65811327 -0.01403333
alpha[11] -0.952224879 0.030456435 0.9841136 -2.8609631 -1.61428939 -0.94908875
alpha[12]  0.112525429 0.030542971 0.9908766 -1.7959393 -0.55006481  0.12324985
alpha[13] -0.484842878 0.030383686 0.9897050 -2.3869730 -1.15515869 -0.48206765
alpha[14] -0.828724981 0.030542724 1.0005741 -2.7864126 -1.50233594 -0.81760096
alpha[15] -0.872364325 0.030515755 0.9811754 -2.7695503 -1.53546168 -0.86629816
alpha[16]  0.395148834 0.030530467 0.9840926 -1.5133611 -0.26054166  0.39675461
alpha[17] -0.270767884 0.030604498 1.0259388 -2.2828263 -0.95767374 -0.27159709
alpha[18] -0.699694944 0.030559616 0.9975773 -2.6256240 -1.36684413 -0.69544010
alpha[19]  0.275827467 0.030482716 0.9898091 -1.6488446 -0.39167382  0.28635978
alpha[20] -1.016296672 0.030472548 1.0061288 -2.9940627 -1.67855882 -1.01097200
alpha[21]  0.227325127 0.030447877 0.9963309 -1.7179675 -0.44275006  0.23506741
alpha[22]  0.051852208 0.030416069 0.9794981 -1.8508505 -0.61139965  0.05423709
alpha[23]  0.406150652 0.030284014 0.9677748 -1.4687780 -0.24031430  0.40669707
alpha[24]  0.351915456 0.030408852 0.9702792 -1.5216778 -0.30141692  0.35464972
alpha[25]  0.376041968 0.030571050 0.9880088 -1.5098196 -0.28862058  0.37792905
beta[1]   -0.020511886 0.012419711 0.7177639 -1.4185088 -0.50887378 -0.02490622
beta[2]   -0.012251241 0.012431407 0.7180507 -1.4054210 -0.49855818 -0.01805745
                  75%     97.5%    n_eff     Rhat
alpha_bar  0.65932099 1.9359699 1024.989 1.003871
sigma      0.73662522 0.9264071 4721.677 1.000199
alpha[1]   0.73274718 2.0634933 1047.561 1.004016
alpha[2]   0.54846165 1.8396640 1035.650 1.003887
alpha[3]   1.08963351 2.3857676 1040.860 1.004041
alpha[4]   2.17290742 3.4643214 1041.378 1.003650
alpha[5]   1.48332315 2.7759597 1041.507 1.003935
alpha[6]   1.23547807 2.5469370 1029.994 1.004037
alpha[7]   0.88266915 2.1991909 1018.203 1.004002
alpha[8]   1.12752455 2.4350621 1040.978 1.003686
alpha[9]   0.24415900 1.5379682 1048.275 1.003798
alpha[10]  0.63255957 1.9494239 1013.479 1.004110
alpha[11] -0.29342285 1.0265801 1044.077 1.003779
alpha[12]  0.77078097 2.1066684 1052.487 1.003858
alpha[13]  0.17139853 1.4827349 1061.037 1.003906
alpha[14] -0.16765236 1.1736633 1073.206 1.004296
alpha[15] -0.22090492 1.0806423 1033.820 1.004058
alpha[16]  1.05009349 2.3719805 1038.975 1.004060
alpha[17]  0.42311115 1.7441187 1123.757 1.004024
alpha[18] -0.04191571 1.2920292 1065.608 1.003902
alpha[19]  0.93451146 2.2354252 1054.376 1.003851
alpha[20] -0.34323283 0.9945033 1090.158 1.003453
alpha[21]  0.88491649 2.2171462 1070.763 1.003673
alpha[22]  0.70629204 2.0146864 1037.053 1.003813
alpha[23]  1.05346697 2.3513569 1021.226 1.004063
alpha[24]  0.99506489 2.3096017 1018.107 1.003973
alpha[25]  1.03320761 2.3677921 1044.482 1.004092
beta[1]    0.45326510 1.4041386 3339.952 1.001816
beta[2]    0.46502102 1.4183657 3336.335 1.001856
Phase 1 to Phase 3

The data list:

ord_mm_dataA_13 <- list(
    N = NROW(d_final_13),              
    phase_ind = d_final_13$phase_ind,
    J = nlevels(d_final_13$faculty),  
    faculty_ind = d_final_13$faculty_ind,
    K = nlevels(d_final_13$grade_coll), 
    y = d_final_13$grade_ord
)

Fit the model:

ord_mm_fitA_13 <- sampling(ord_mm_modelA,
                           data = ord_mm_dataA_13,
                           seed = 11115)

Coefficients of the model:

summary(ord_mm_fitA_13, pars = c("alpha_bar", "sigma", "alpha", "beta"))$summary
                 mean     se_mean        sd       2.5%        25%         50%
alpha_bar  0.03280878 0.038745313 0.9444168 -1.8333953 -0.5908930  0.05805456
sigma      0.70510253 0.004308172 0.1853772  0.4381727  0.5727942  0.67509822
alpha[1]   0.02227800 0.040921451 0.9885992 -1.9612982 -0.6128863  0.04842078
alpha[2]  -0.19695505 0.040900475 0.9799683 -2.1401574 -0.8253822 -0.18223778
alpha[3]  -0.06792481 0.040916144 0.9854422 -2.0272433 -0.7191375 -0.04196462
alpha[4]   1.30440591 0.040997573 0.9765458 -0.6471014  0.6645066  1.32022014
alpha[5]   0.48140922 0.040984251 0.9882347 -1.5057686 -0.1754425  0.50338012
alpha[6]   0.43553119 0.040558890 0.9739406 -1.4894629 -0.2060175  0.45536832
alpha[7]   0.17244269 0.041279739 0.9752734 -1.7446940 -0.4567361  0.19040401
alpha[8]   0.24565720 0.040806649 0.9787358 -1.6951679 -0.3918444  0.25529683
alpha[9]  -0.59432499 0.040911290 0.9812033 -2.5381528 -1.2375589 -0.58487727
alpha[10] -0.30959871 0.040891329 0.9708060 -2.2334812 -0.9395077 -0.29110418
alpha[11] -1.07363253 0.041020881 0.9927481 -3.0802238 -1.7271077 -1.07116182
beta[1]    0.11599572 0.017689802 0.7125427 -1.2554116 -0.3617500  0.12389328
beta[2]   -0.11025070 0.017748871 0.7118780 -1.4700615 -0.5920231 -0.10628502
                  75%     97.5%     n_eff     Rhat
alpha_bar  0.67580689 1.8091672  594.1403 1.008116
sigma      0.80171599 1.1559964 1851.5125 1.000046
alpha[1]   0.66602255 1.9177266  583.6312 1.008871
alpha[2]   0.45407783 1.6714204  574.0734 1.008698
alpha[3]   0.59189776 1.7853584  580.0600 1.008253
alpha[4]   1.94775144 3.1623100  567.3733 1.008687
alpha[5]   1.16509885 2.3732881  581.4149 1.008136
alpha[6]   1.08499728 2.3014200  576.6241 1.008402
alpha[7]   0.82879232 2.0208206  558.1859 1.009376
alpha[8]   0.89867179 2.0997117  575.2665 1.008457
alpha[9]   0.06491474 1.2503523  575.2169 1.008848
alpha[10]  0.32764178 1.5160903  563.6409 1.008860
alpha[11] -0.41679210 0.8691978  585.6905 1.008319
beta[1]    0.59768674 1.4806983 1622.4669 1.000055
beta[2]    0.37019590 1.2717695 1608.6800 1.000321

Model B

data {
  int<lower=0> N;                     // sample size
  int<lower=1, upper=2> phase_ind[N]; // two phases
  int<lower=2> J;                     // number of faculty
  int<lower=1> faculty_ind[N];        // faculty array
  int<lower=1> gender_ind[N];         // gender array
  int<lower=1> phase_gender[N];       // phase/gender interaction
  int<lower=1> race_ind[N];           // race array
  int<lower=1> phase_race[N];         // phase/race interaction
  int<lower=2> K;                     // number of grade categories
  int<lower=1, upper=K> y[N];         // grade codes
}
parameters {
  real alpha_bar;
  real<lower=0> sigma;
  real alpha[J];
  real beta[2];
  real gamma[2];
  real delta[4];
  real rho[2];
  real zeta[4];
  ordered[K - 1] c;
}
model {
  alpha_bar ~ normal(0, 1);
  sigma ~ exponential(1);
  alpha ~ normal(alpha_bar, sigma);
  beta ~ normal(0, 1);
  gamma ~ normal(0, 1);
  delta ~ normal(0, 1);
  rho ~ normal(0, 1);
  zeta ~ normal(0, 1);
  for (n in 1:N) {
    real eta;
    eta = alpha[faculty_ind[n]] + beta[phase_ind[n]] + 
      gamma[gender_ind[n]] + delta[phase_gender[n]] +
      rho[race_ind[n]] + zeta[phase_race[n]];
    y[n] ~ ordered_logistic(eta, c);
  }
}
Phase 1 to Phase 2

The data list:

ord_mm_dataB_12 <- list(
    N = NROW(d_final_12),              
    phase_ind = d_final_12$phase_ind,
    J = nlevels(d_final_12$faculty),  
    faculty_ind = d_final_12$faculty_ind,
    gender_ind = d_final_12$gender_ind,
    phase_gender = d_final_12$phase_gender,
    race_ind = d_final_12$race_ind,
    phase_race = d_final_12$phase_race,
    K = nlevels(d_final_12$grade_coll), 
    y = d_final_12$grade_ord
)

Fit the model:

ord_mm_fitB_12 <- sampling(ord_mm_modelB,
                           data = ord_mm_dataB_12,
                           iter = 8000,
                           seed = 11116)

Coefficients of the model:

summary(ord_mm_fitB_12, pars = c("alpha_bar", "sigma", "alpha", "beta",
                                 "gamma", "delta", "rho", "zeta"))$summary
                   mean      se_mean        sd       2.5%         25%
alpha_bar -0.0268762639 0.0267624113 0.9937118 -1.9771950 -0.70317724
sigma      0.6124813049 0.0007441803 0.1076658  0.4354759  0.53674659
alpha[1]   0.1149859515 0.0272224718 1.0243387 -1.8917763 -0.58763298
alpha[2]  -0.0430983029 0.0272356946 1.0130657 -2.0362678 -0.73381516
alpha[3]   0.3865731896 0.0270763595 1.0170150 -1.5986965 -0.31187190
alpha[4]   1.2810060015 0.0270861747 1.0170612 -0.7088434  0.58964716
alpha[5]   0.6496153452 0.0272142919 1.0188881 -1.3229947 -0.04826851
alpha[6]   0.3474570937 0.0271517665 1.0130124 -1.6307638 -0.34086975
alpha[7]   0.2930616644 0.0271446213 1.0087991 -1.6781631 -0.39659992
alpha[8]   0.4745274718 0.0271080374 1.0151001 -1.5022727 -0.21996119
alpha[9]  -0.5416671382 0.0272853191 1.0215090 -2.5281665 -1.24147568
alpha[10] -0.1965815020 0.0271200079 1.0069573 -2.1556381 -0.88381013
alpha[11] -0.9044956803 0.0271632670 1.0216099 -2.9101445 -1.60283897
alpha[12]  0.1561437312 0.0270311130 1.0251651 -1.8345175 -0.53610502
alpha[13] -0.4682412082 0.0272591286 1.0275613 -2.4734557 -1.17032595
alpha[14] -0.7825654976 0.0272835280 1.0361773 -2.8024535 -1.48694745
alpha[15] -0.7923717001 0.0272007025 1.0195850 -2.7980248 -1.48514200
alpha[16]  0.4642855565 0.0273053707 1.0201964 -1.5282186 -0.23048393
alpha[17] -0.3001316136 0.0271014558 1.0568241 -2.3874592 -1.02456385
alpha[18] -0.7238948867 0.0273879051 1.0396533 -2.7488775 -1.43928554
alpha[19] -0.1140586466 0.0271430245 1.0267024 -2.1137006 -0.81457357
alpha[20] -0.9583003430 0.0272978352 1.0415367 -2.9937823 -1.66487007
alpha[21]  0.1982960653 0.0270619798 1.0322711 -1.8320052 -0.51086709
alpha[22]  0.0006873965 0.0272219327 1.0169526 -1.9796695 -0.70132329
alpha[23]  0.2852584204 0.0270239835 1.0077783 -1.6847825 -0.40214108
alpha[24]  0.1733491225 0.0271804376 1.0086593 -1.8073602 -0.51074801
alpha[25]  0.3218258720 0.0272212769 1.0281479 -1.6920504 -0.38839958
beta[1]   -0.0365592338 0.0060725363 0.8576158 -1.7155849 -0.61248750
beta[2]    0.0397203108 0.0061355338 0.8750207 -1.7010115 -0.55906586
gamma[1]   0.0726196317 0.0063304629 0.8237138 -1.5754376 -0.47108270
gamma[2]  -0.0760252516 0.0062617154 0.8188428 -1.6860356 -0.62551660
delta[1]   0.1062041681 0.0059075486 0.7863891 -1.4245766 -0.42443387
delta[2]  -0.1393220636 0.0058636269 0.7845242 -1.6905555 -0.66479199
delta[3]  -0.0416191068 0.0058377609 0.7743450 -1.5525482 -0.56300291
delta[4]   0.0821118475 0.0059716076 0.7844037 -1.4502454 -0.44311003
rho[1]    -0.2473758000 0.0059974900 0.8015921 -1.7952746 -0.79349272
rho[2]     0.2450904501 0.0061622100 0.8107048 -1.3458526 -0.30518588
zeta[1]   -0.0700634967 0.0058551843 0.7863971 -1.6128656 -0.60222550
zeta[2]    0.0298895111 0.0059422881 0.7789123 -1.5092066 -0.48981695
zeta[3]   -0.1673098435 0.0058286237 0.7852595 -1.7108262 -0.69816629
zeta[4]    0.2160799118 0.0059430866 0.7788470 -1.3208207 -0.31684202
                   50%         75%     97.5%     n_eff      Rhat
alpha_bar -0.022275871  0.64182497 1.9373621  1378.702 1.0030502
sigma      0.601420957  0.67535893 0.8546775 20931.448 0.9999192
alpha[1]   0.128667966  0.80421510 2.1372176  1415.898 1.0030162
alpha[2]  -0.037733402  0.63501327 1.9716809  1383.561 1.0031744
alpha[3]   0.389194738  1.06544724 2.3853421  1410.828 1.0028875
alpha[4]   1.290077798  1.96929311 3.2983117  1409.934 1.0029396
alpha[5]   0.662394959  1.32840328 2.6620387  1401.712 1.0030125
alpha[6]   0.360422325  1.02539846 2.3468869  1391.981 1.0031597
alpha[7]   0.304381573  0.97727300 2.2907300  1381.153 1.0030114
alpha[8]   0.484981447  1.16111095 2.4744262  1402.238 1.0030597
alpha[9]  -0.534457622  0.14835862 1.4693843  1401.607 1.0031063
alpha[10] -0.184294946  0.48244586 1.7864202  1378.613 1.0031900
alpha[11] -0.894273613 -0.21407103 1.1239928  1414.510 1.0031428
alpha[12]  0.160934893  0.84888962 2.2006323  1438.334 1.0027778
alpha[13] -0.456218668  0.22020983 1.5531123  1420.992 1.0032547
alpha[14] -0.776918287 -0.08836516 1.2658990  1442.338 1.0028621
alpha[15] -0.787926849 -0.10117450 1.2163490  1405.033 1.0031646
alpha[16]  0.472526556  1.14939188 2.4860101  1395.955 1.0030304
alpha[17] -0.289630292  0.42376300 1.7614096  1520.618 1.0027072
alpha[18] -0.713496189 -0.03481333 1.3450132  1440.985 1.0030018
alpha[19] -0.102109514  0.57681151 1.9236175  1430.779 1.0032206
alpha[20] -0.942026281 -0.26037218 1.0783301  1455.770 1.0031342
alpha[21]  0.210445269  0.90172362 2.2389241  1455.018 1.0026026
alpha[22]  0.008686386  0.68936524 2.0096748  1395.608 1.0031388
alpha[23]  0.295872805  0.96821847 2.2761050  1390.693 1.0030078
alpha[24]  0.181276445  0.86085519 2.1628625  1377.134 1.0032437
alpha[25]  0.329772652  1.02473482 2.3584777  1426.574 1.0028032
beta[1]   -0.045781289  0.53801880 1.6504596 19945.515 0.9999034
beta[2]    0.042423035  0.62880942 1.7749867 20339.111 1.0000456
gamma[1]   0.077475321  0.61973743 1.6797851 16930.966 1.0005421
gamma[2]  -0.067114570  0.48076196 1.4978922 17100.721 1.0000316
delta[1]   0.105073571  0.63309246 1.6589932 17719.865 0.9999375
delta[2]  -0.137477200  0.39220395 1.3933264 17901.115 0.9998856
delta[3]  -0.040043546  0.47857012 1.5001161 17594.476 0.9999679
delta[4]   0.085183496  0.60695230 1.6160335 17254.274 0.9998827
rho[1]    -0.254726937  0.29445746 1.3201161 17863.553 1.0002577
rho[2]     0.240647986  0.79689189 1.8474214 17308.222 0.9998542
zeta[1]   -0.070088079  0.45389795 1.4614544 18038.594 0.9998077
zeta[2]    0.029407439  0.55694297 1.5524679 17181.844 1.0001003
zeta[3]   -0.167745411  0.36415608 1.3621117 18150.739 0.9998427
zeta[4]    0.220400019  0.75235478 1.7127167 17174.344 1.0004454

Phase 1 to Phase 3

The data list:

ord_mm_dataB_13 <- list(
    N = NROW(d_final_13),              
    phase_ind = d_final_13$phase_ind,
    J = nlevels(d_final_13$faculty),  
    faculty_ind = d_final_13$faculty_ind,
    gender_ind = d_final_13$gender_ind,
    phase_gender = d_final_13$phase_gender,
    race_ind = d_final_13$race_ind,
    phase_race = d_final_13$phase_race,
    K = nlevels(d_final_13$grade_coll), 
    y = d_final_13$grade_ord
)

Fit the model:

ord_mm_fitB_13 <- sampling(ord_mm_modelB,
                           data = ord_mm_dataB_13,
                           seed = 11117)

Coefficients of the model:

summary(ord_mm_fitB_13, pars = c("alpha_bar", "sigma", "alpha", "beta",
                                 "gamma", "delta", "rho", "zeta"))$summary
                  mean     se_mean        sd       2.5%        25%          50%
alpha_bar -0.001471763 0.036209140 1.0090583 -2.0492627 -0.6556299  0.038849541
sigma      0.646337317 0.002902943 0.1807787  0.3854657  0.5209696  0.615585703
alpha[1]   0.167195026 0.038196086 1.0495344 -1.9227590 -0.5288647  0.190847968
alpha[2]  -0.112513136 0.038418813 1.0465414 -2.2046255 -0.7960780 -0.093334432
alpha[3]  -0.033576357 0.038379100 1.0492057 -2.1174890 -0.7204179 -0.007690968
alpha[4]   1.086458369 0.037872604 1.0367399 -0.9983651  0.4119324  1.107074094
alpha[5]   0.322504441 0.037954126 1.0461087 -1.8152115 -0.3627410  0.342943497
alpha[6]   0.161147217 0.037945068 1.0350511 -1.9002385 -0.5087899  0.197006419
alpha[7]   0.254616281 0.038045096 1.0337275 -1.7718010 -0.4189860  0.277420783
alpha[8]   0.284155533 0.038355120 1.0404414 -1.7911308 -0.3967445  0.316665686
alpha[9]  -0.623452941 0.037530908 1.0424816 -2.7077485 -1.2889570 -0.599303291
alpha[10] -0.491427351 0.037819535 1.0306757 -2.5667558 -1.1576600 -0.475650489
alpha[11] -0.999196111 0.038256326 1.0491466 -3.0954857 -1.7093561 -0.973194244
beta[1]    0.030106392 0.011643969 0.8661377 -1.7461084 -0.5464601  0.042650300
beta[2]    0.007977114 0.011763037 0.8909157 -1.7766736 -0.5782747  0.006536847
gamma[1]   0.076963579 0.012320637 0.8423541 -1.5426931 -0.4996361  0.082187602
gamma[2]  -0.088447303 0.012237844 0.8127498 -1.6847978 -0.6524259 -0.081964739
delta[1]   0.134347411 0.010490586 0.7685303 -1.3416538 -0.3911382  0.125998767
delta[2]  -0.135605897 0.010199780 0.8011535 -1.6924313 -0.6871572 -0.121869196
delta[3]  -0.102299909 0.010753558 0.7907185 -1.6682730 -0.6352055 -0.097133478
delta[4]   0.074091739 0.010206675 0.7822406 -1.4668425 -0.4529287  0.069059161
rho[1]    -0.290383952 0.010532786 0.8113602 -1.8932760 -0.8433822 -0.285201640
rho[2]     0.305576529 0.010220241 0.8031747 -1.2708818 -0.2251190  0.305091262
zeta[1]   -0.079082692 0.010237516 0.7769264 -1.5944271 -0.6095494 -0.076078534
zeta[2]    0.075866887 0.010345664 0.7688075 -1.4023087 -0.4510489  0.073055317
zeta[3]   -0.229343801 0.010894157 0.7640890 -1.7390401 -0.7386338 -0.216351345
zeta[4]    0.195547966 0.010708328 0.7774079 -1.3546937 -0.3303042  0.208079063
                  75%    97.5%     n_eff      Rhat
alpha_bar  0.66547283 1.921028  776.5977 1.0038538
sigma      0.73922979 1.084112 3878.0868 0.9998272
alpha[1]   0.84713448 2.211668  755.0151 1.0040731
alpha[2]   0.58994280 1.892645  742.0360 1.0037583
alpha[3]   0.67698163 2.010386  747.3633 1.0036847
alpha[4]   1.76067254 3.140392  749.3579 1.0036117
alpha[5]   1.00540867 2.351316  759.6886 1.0040607
alpha[6]   0.84277618 2.190343  744.0685 1.0037104
alpha[7]   0.93667667 2.274858  738.2692 1.0037732
alpha[8]   0.98239879 2.315507  735.8487 1.0034018
alpha[9]   0.06135649 1.409806  771.5404 1.0030400
alpha[10]  0.17629305 1.547322  742.6971 1.0035615
alpha[11] -0.30656376 1.085342  752.0832 1.0036190
beta[1]    0.61306057 1.726937 5533.1425 0.9994772
beta[2]    0.60615024 1.783908 5736.3324 0.9995556
gamma[1]   0.62466093 1.724521 4674.3701 0.9995452
gamma[2]   0.47047709 1.516442 4410.6626 1.0005215
delta[1]   0.66034467 1.647334 5366.8884 0.9994926
delta[2]   0.40148989 1.411885 6169.4977 0.9995869
delta[3]   0.41943426 1.473636 5406.7891 0.9994569
delta[4]   0.59457376 1.613675 5873.7051 0.9997241
rho[1]     0.24758105 1.294939 5933.9098 0.9999407
rho[2]     0.82620151 1.877970 6175.8642 0.9993296
zeta[1]    0.45877262 1.416768 5759.3109 0.9998375
zeta[2]    0.58667190 1.617786 5522.2801 0.9998771
zeta[3]    0.28734899 1.256441 4919.2697 1.0003794
zeta[4]    0.71413244 1.660768 5270.5342 0.9997641

Results

Odds ratios

Model A

Phase 1 to Phase 2
ord_mm_tidyA_12 <- ord_mm_fitA_12 %>%
    spread_draws(alpha[..], beta[..], c[..]) %>%
    mutate(or = exp(beta.1 - beta.2))
ggplot(ord_mm_tidyA_12, aes(x = or)) +
    geom_histogram() +
    geom_vline(xintercept = 1, color = "blue")

table(ord_mm_tidyA_12$or >= 1)/NROW(ord_mm_tidyA_12)

   FALSE     TRUE 
0.542625 0.457375 
Phase 1 to Phase 3
ord_mm_tidyA_13 <- ord_mm_fitA_13 %>%
    spread_draws(alpha[..], beta[..], c[..]) %>%
    mutate(or = exp(beta.1 - beta.2))
ggplot(ord_mm_tidyA_13, aes(x = or)) +
    geom_histogram() +
    geom_vline(xintercept = 1, color = "blue")

table(ord_mm_tidyA_13$or >= 1)/NROW(ord_mm_tidyA_13)

  FALSE    TRUE 
0.00575 0.99425 

Model B

Phase 1 to Phase 2
ord_mm_tidyB_12 <- ord_mm_fitB_12 %>%
    spread_draws(alpha[..], beta[..], gamma[..], c[..],
                 delta[..], rho[..], zeta[..]) %>%
    mutate(or_men_WA = exp(beta.1 - beta.2 + delta.1 - delta.3 + zeta.1 - zeta.3),
           or_women_WA = exp(beta.1 - beta.2 + delta.2 - delta.4 + zeta.1 - zeta.3),
           or_men_BHI = exp(beta.1 - beta.2 + delta.1 - delta.3 + zeta.2 - zeta.4),
           or_women_BHI = exp(beta.1 - beta.2 + delta.2 - delta.4 + zeta.2 - zeta.4))
ggplot(ord_mm_tidyB_12, aes(x = or_men_BHI)) +
    geom_histogram() +
    geom_vline(xintercept = 1, color = "blue")

table(ord_mm_tidyB_12$or_men_BHI >= 1)/NROW(ord_mm_tidyB_12)

    FALSE      TRUE 
0.7766875 0.2233125 
ggplot(ord_mm_tidyB_12, aes(x = or_women_BHI)) +
    geom_histogram() +
    geom_vline(xintercept = 1, color = "blue")

table(ord_mm_tidyB_12$or_women_BHI >= 1)/NROW(ord_mm_tidyB_12)

    FALSE      TRUE 
0.9945625 0.0054375 
ggplot(ord_mm_tidyB_12, aes(x = or_men_WA)) +
    geom_histogram() +
    geom_vline(xintercept = 1, color = "blue")

table(ord_mm_tidyB_12$or_men_WA >= 1)/NROW(ord_mm_tidyB_12)

   FALSE     TRUE 
0.040875 0.959125 
ggplot(ord_mm_tidyB_12, aes(x = or_women_WA)) +
    geom_histogram() +
    geom_vline(xintercept = 1, color = "blue")

table(ord_mm_tidyB_12$or_women_WA >= 1)/NROW(ord_mm_tidyB_12)

    FALSE      TRUE 
0.8976875 0.1023125 
Phase 1 to Phase 3
ord_mm_tidyB_13 <- ord_mm_fitB_13 %>%
    spread_draws(alpha[..], beta[..], gamma[..], c[..],
                 delta[..], rho[..], zeta[..]) %>%
    mutate(or_men_WA = exp(beta.1 - beta.2 + delta.1 - delta.3 + zeta.1 - zeta.3),
           or_women_WA = exp(beta.1 - beta.2 + delta.2 - delta.4 + zeta.1 - zeta.3),
           or_men_BHI = exp(beta.1 - beta.2 + delta.1 - delta.3 + zeta.2 - zeta.4),
           or_women_BHI = exp(beta.1 - beta.2 + delta.2 - delta.4 + zeta.2 - zeta.4))
ggplot(ord_mm_tidyB_13, aes(x = or_men_BHI)) +
    geom_histogram() +
    geom_vline(xintercept = 1, color = "blue")

table(ord_mm_tidyB_13$or_men_BHI >= 1)/NROW(ord_mm_tidyB_13)

  FALSE    TRUE 
0.20125 0.79875 
ggplot(ord_mm_tidyB_13, aes(x = or_women_BHI)) +
    geom_histogram() +
    geom_vline(xintercept = 1, color = "blue")

table(ord_mm_tidyB_13$or_women_BHI >= 1)/NROW(ord_mm_tidyB_13)

 FALSE   TRUE 
0.9075 0.0925 
ggplot(ord_mm_tidyB_13, aes(x = or_men_WA)) +
    geom_histogram() +
    geom_vline(xintercept = 1, color = "blue")

table(ord_mm_tidyB_13$or_men_WA >= 1)/NROW(ord_mm_tidyB_13)

 FALSE   TRUE 
0.0005 0.9995 
ggplot(ord_mm_tidyB_13, aes(x = or_women_WA)) +
    geom_histogram() +
    geom_vline(xintercept = 1, color = "blue")

table(ord_mm_tidyB_13$or_women_WA >= 1)/NROW(ord_mm_tidyB_13)

FALSE  TRUE 
0.573 0.427 

Faculty differences for Model A

Phase 1 to Phase 2

ord_mm_tidyA_12 <- ord_mm_fitA_12 %>%
    spread_draws(alpha[..], beta[..], c[..]) %>%
    mutate(or = exp(beta.1 - beta.2),
           A1_1 = 1 - plogis(alpha.1 + beta.1 - c.1),
           A2_1 = 1 - plogis(alpha.2 + beta.1 - c.1),
           A3_1 = 1 - plogis(alpha.3 + beta.1 - c.1),
           A4_1 = 1 - plogis(alpha.4 + beta.1 - c.1),
           A5_1 = 1 - plogis(alpha.5 + beta.1 - c.1),
           A6_1 = 1 - plogis(alpha.6 + beta.1 - c.1),
           A7_1 = 1 - plogis(alpha.7 + beta.1 - c.1),
           A8_1 = 1 - plogis(alpha.8 + beta.1 - c.1),
           A9_1 = 1 - plogis(alpha.9 + beta.1 - c.1),
           A10_1 = 1 - plogis(alpha.10 + beta.1 - c.1),
           A11_1 = 1 - plogis(alpha.11 + beta.1 - c.1),
           A12_1 = 1 - plogis(alpha.12 + beta.1 - c.1),
           A13_1 = 1 - plogis(alpha.13 + beta.1 - c.1),
           A14_1 = 1 - plogis(alpha.14 + beta.1 - c.1),
           A15_1 = 1 - plogis(alpha.15 + beta.1 - c.1),
           A16_1 = 1 - plogis(alpha.16 + beta.1 - c.1),
           A17_1 = 1 - plogis(alpha.17 + beta.1 - c.1),
           A18_1 = 1 - plogis(alpha.18 + beta.1 - c.1),
           A19_1 = 1 - plogis(alpha.19 + beta.1 - c.1),
           A20_1 = 1 - plogis(alpha.20 + beta.1 - c.1),
           A21_1 = 1 - plogis(alpha.21 + beta.1 - c.1),
           A22_1 = 1 - plogis(alpha.22 + beta.1 - c.1),
           A23_1 = 1 - plogis(alpha.23 + beta.1 - c.1),
           A24_1 = 1 - plogis(alpha.24 + beta.1 - c.1),
           A25_1 = 1 - plogis(alpha.25 + beta.1 - c.1),
           A1_2 = 1 - plogis(alpha.1 + beta.2 - c.1),
           A2_2 = 1 - plogis(alpha.2 + beta.2 - c.1),
           A3_2 = 1 - plogis(alpha.3 + beta.2 - c.1),
           A4_2 = 1 - plogis(alpha.4 + beta.2 - c.1),
           A5_2 = 1 - plogis(alpha.5 + beta.2 - c.1),
           A6_2 = 1 - plogis(alpha.6 + beta.2 - c.1),
           A7_2 = 1 - plogis(alpha.7 + beta.2 - c.1),
           A8_2 = 1 - plogis(alpha.8 + beta.2 - c.1),
           A9_2 = 1 - plogis(alpha.9 + beta.2 - c.1),
           A10_2 = 1 - plogis(alpha.10 + beta.2 - c.1),
           A11_2 = 1 - plogis(alpha.11 + beta.2 - c.1),
           A12_2 = 1 - plogis(alpha.12 + beta.2 - c.1),
           A13_2 = 1 - plogis(alpha.13 + beta.2 - c.1),
           A14_2 = 1 - plogis(alpha.14 + beta.2 - c.1),
           A15_2 = 1 - plogis(alpha.15 + beta.2 - c.1),
           A16_2 = 1 - plogis(alpha.16 + beta.2 - c.1),
           A17_2 = 1 - plogis(alpha.17 + beta.2 - c.1),
           A18_2 = 1 - plogis(alpha.18 + beta.2 - c.1),
           A19_2 = 1 - plogis(alpha.19 + beta.2 - c.1),
           A20_2 = 1 - plogis(alpha.20 + beta.2 - c.1),
           A21_2 = 1 - plogis(alpha.21 + beta.2 - c.1),
           A22_2 = 1 - plogis(alpha.22 + beta.2 - c.1),
           A23_2 = 1 - plogis(alpha.23 + beta.2 - c.1),
           A24_2 = 1 - plogis(alpha.24 + beta.2 - c.1),
           A25_2 = 1 - plogis(alpha.25 + beta.2 - c.1),
           B1_1 = plogis(alpha.1 + beta.1 - c.1) - plogis(alpha.1 + beta.1 - c.2),
           B2_1 = plogis(alpha.2 + beta.1 - c.1) - plogis(alpha.2 + beta.1 - c.2),
           B3_1 = plogis(alpha.3 + beta.1 - c.1) - plogis(alpha.3 + beta.1 - c.2),
           B4_1 = plogis(alpha.4 + beta.1 - c.1) - plogis(alpha.4 + beta.1 - c.2),
           B5_1 = plogis(alpha.5 + beta.1 - c.1) - plogis(alpha.5 + beta.1 - c.2),
           B6_1 = plogis(alpha.6 + beta.1 - c.1) - plogis(alpha.6 + beta.1 - c.2),
           B7_1 = plogis(alpha.7 + beta.1 - c.1) - plogis(alpha.7 + beta.1 - c.2),
           B8_1 = plogis(alpha.8 + beta.1 - c.1) - plogis(alpha.8 + beta.1 - c.2),
           B9_1 = plogis(alpha.9 + beta.1 - c.1) - plogis(alpha.9 + beta.1 - c.2),
           B10_1 = plogis(alpha.10 + beta.1 - c.1) - plogis(alpha.10 + beta.1 - c.2),
           B11_1 = plogis(alpha.11 + beta.1 - c.1) - plogis(alpha.11 + beta.1 - c.2),
           B12_1 = plogis(alpha.12 + beta.1 - c.1) - plogis(alpha.12 + beta.1 - c.2),
           B13_1 = plogis(alpha.13 + beta.1 - c.1) - plogis(alpha.13 + beta.1 - c.2),
           B14_1 = plogis(alpha.14 + beta.1 - c.1) - plogis(alpha.14 + beta.1 - c.2),
           B15_1 = plogis(alpha.15 + beta.1 - c.1) - plogis(alpha.15 + beta.1 - c.2),
           B16_1 = plogis(alpha.16 + beta.1 - c.1) - plogis(alpha.16 + beta.1 - c.2),
           B17_1 = plogis(alpha.17 + beta.1 - c.1) - plogis(alpha.17 + beta.1 - c.2),
           B18_1 = plogis(alpha.18 + beta.1 - c.1) - plogis(alpha.18 + beta.1 - c.2),
           B19_1 = plogis(alpha.19 + beta.1 - c.1) - plogis(alpha.19 + beta.1 - c.2),
           B20_1 = plogis(alpha.20 + beta.1 - c.1) - plogis(alpha.20 + beta.1 - c.2),
           B21_1 = plogis(alpha.21 + beta.1 - c.1) - plogis(alpha.21 + beta.1 - c.2),
           B22_1 = plogis(alpha.22 + beta.1 - c.1) - plogis(alpha.22 + beta.1 - c.2),
           B23_1 = plogis(alpha.23 + beta.1 - c.1) - plogis(alpha.23 + beta.1 - c.2),
           B24_1 = plogis(alpha.24 + beta.1 - c.1) - plogis(alpha.24 + beta.1 - c.2),
           B25_1 = plogis(alpha.25 + beta.1 - c.1) - plogis(alpha.25 + beta.1 - c.2),
           B1_2 = plogis(alpha.1 + beta.2 - c.1) - plogis(alpha.1 + beta.2 - c.2),
           B2_2 = plogis(alpha.2 + beta.2 - c.1) - plogis(alpha.2 + beta.2 - c.2),
           B3_2 = plogis(alpha.3 + beta.2 - c.1) - plogis(alpha.3 + beta.2 - c.2),
           B4_2 = plogis(alpha.4 + beta.2 - c.1) - plogis(alpha.4 + beta.2 - c.2),
           B5_2 = plogis(alpha.5 + beta.2 - c.1) - plogis(alpha.5 + beta.2 - c.2),
           B6_2 = plogis(alpha.6 + beta.2 - c.1) - plogis(alpha.6 + beta.2 - c.2),
           B7_2 = plogis(alpha.7 + beta.2 - c.1) - plogis(alpha.7 + beta.2 - c.2),
           B8_2 = plogis(alpha.8 + beta.2 - c.1) - plogis(alpha.8 + beta.2 - c.2),
           B9_2 = plogis(alpha.9 + beta.2 - c.1) - plogis(alpha.9 + beta.2 - c.2),
           B10_2 = plogis(alpha.10 + beta.2 - c.1) - plogis(alpha.10 + beta.2 - c.2),
           B11_2 = plogis(alpha.11 + beta.2 - c.1) - plogis(alpha.11 + beta.2 - c.2),
           B12_2 = plogis(alpha.12 + beta.2 - c.1) - plogis(alpha.12 + beta.2 - c.2),
           B13_2 = plogis(alpha.13 + beta.2 - c.1) - plogis(alpha.13 + beta.2 - c.2),
           B14_2 = plogis(alpha.14 + beta.2 - c.1) - plogis(alpha.14 + beta.2 - c.2),
           B15_2 = plogis(alpha.15 + beta.2 - c.1) - plogis(alpha.15 + beta.2 - c.2),
           B16_2 = plogis(alpha.16 + beta.2 - c.1) - plogis(alpha.16 + beta.2 - c.2),
           B17_2 = plogis(alpha.17 + beta.2 - c.1) - plogis(alpha.17 + beta.2 - c.2),
           B18_2 = plogis(alpha.18 + beta.2 - c.1) - plogis(alpha.18 + beta.2 - c.2),
           B19_2 = plogis(alpha.19 + beta.2 - c.1) - plogis(alpha.19 + beta.2 - c.2),
           B20_2 = plogis(alpha.20 + beta.2 - c.1) - plogis(alpha.20 + beta.2 - c.2),
           B21_2 = plogis(alpha.21 + beta.2 - c.1) - plogis(alpha.21 + beta.2 - c.2),
           B22_2 = plogis(alpha.22 + beta.2 - c.1) - plogis(alpha.22 + beta.2 - c.2),
           B23_2 = plogis(alpha.23 + beta.2 - c.1) - plogis(alpha.23 + beta.2 - c.2),
           B24_2 = plogis(alpha.24 + beta.2 - c.1) - plogis(alpha.24 + beta.2 - c.2),
           B25_2 = plogis(alpha.25 + beta.2 - c.1) - plogis(alpha.25 + beta.2 - c.2),
           C1_1 = plogis(alpha.1 + beta.1 - c.2) - plogis(alpha.1 + beta.1 - c.3),
           C2_1 = plogis(alpha.2 + beta.1 - c.2) - plogis(alpha.2 + beta.1 - c.3),
           C3_1 = plogis(alpha.3 + beta.1 - c.2) - plogis(alpha.3 + beta.1 - c.3),
           C4_1 = plogis(alpha.4 + beta.1 - c.2) - plogis(alpha.4 + beta.1 - c.3),
           C5_1 = plogis(alpha.5 + beta.1 - c.2) - plogis(alpha.5 + beta.1 - c.3),
           C6_1 = plogis(alpha.6 + beta.1 - c.2) - plogis(alpha.6 + beta.1 - c.3),
           C7_1 = plogis(alpha.7 + beta.1 - c.2) - plogis(alpha.7 + beta.1 - c.3),
           C8_1 = plogis(alpha.8 + beta.1 - c.2) - plogis(alpha.8 + beta.1 - c.3),
           C9_1 = plogis(alpha.9 + beta.1 - c.2) - plogis(alpha.9 + beta.1 - c.3),
           C10_1 = plogis(alpha.10 + beta.1 - c.2) - plogis(alpha.10 + beta.1 - c.3),
           C11_1 = plogis(alpha.11 + beta.1 - c.2) - plogis(alpha.11 + beta.1 - c.3),
           C12_1 = plogis(alpha.12 + beta.1 - c.2) - plogis(alpha.12 + beta.1 - c.3),
           C13_1 = plogis(alpha.13 + beta.1 - c.2) - plogis(alpha.13 + beta.1 - c.3),
           C14_1 = plogis(alpha.14 + beta.1 - c.2) - plogis(alpha.14 + beta.1 - c.3),
           C15_1 = plogis(alpha.15 + beta.1 - c.2) - plogis(alpha.15 + beta.1 - c.3),
           C16_1 = plogis(alpha.16 + beta.1 - c.2) - plogis(alpha.16 + beta.1 - c.3),
           C17_1 = plogis(alpha.17 + beta.1 - c.2) - plogis(alpha.17 + beta.1 - c.3),
           C18_1 = plogis(alpha.18 + beta.1 - c.2) - plogis(alpha.18 + beta.1 - c.3),
           C19_1 = plogis(alpha.19 + beta.1 - c.2) - plogis(alpha.19 + beta.1 - c.3),
           C20_1 = plogis(alpha.20 + beta.1 - c.2) - plogis(alpha.20 + beta.1 - c.3),
           C21_1 = plogis(alpha.21 + beta.1 - c.2) - plogis(alpha.21 + beta.1 - c.3),
           C22_1 = plogis(alpha.22 + beta.1 - c.2) - plogis(alpha.22 + beta.1 - c.3),
           C23_1 = plogis(alpha.23 + beta.1 - c.2) - plogis(alpha.23 + beta.1 - c.3),
           C24_1 = plogis(alpha.24 + beta.1 - c.2) - plogis(alpha.24 + beta.1 - c.3),
           C25_1 = plogis(alpha.25 + beta.1 - c.2) - plogis(alpha.25 + beta.1 - c.3),
           C1_2 = plogis(alpha.1 + beta.2 - c.2) - plogis(alpha.1 + beta.2 - c.3),
           C2_2 = plogis(alpha.2 + beta.2 - c.2) - plogis(alpha.2 + beta.2 - c.3),
           C3_2 = plogis(alpha.3 + beta.2 - c.2) - plogis(alpha.3 + beta.2 - c.3),
           C4_2 = plogis(alpha.4 + beta.2 - c.2) - plogis(alpha.4 + beta.2 - c.3),
           C5_2 = plogis(alpha.5 + beta.2 - c.2) - plogis(alpha.5 + beta.2 - c.3),
           C6_2 = plogis(alpha.6 + beta.2 - c.2) - plogis(alpha.6 + beta.2 - c.3),
           C7_2 = plogis(alpha.7 + beta.2 - c.2) - plogis(alpha.7 + beta.2 - c.3),
           C8_2 = plogis(alpha.8 + beta.2 - c.2) - plogis(alpha.8 + beta.2 - c.3),
           C9_2 = plogis(alpha.9 + beta.2 - c.2) - plogis(alpha.9 + beta.2 - c.3),
           C10_2 = plogis(alpha.10 + beta.2 - c.2) - plogis(alpha.10 + beta.2 - c.3),
           C11_2 = plogis(alpha.11 + beta.2 - c.2) - plogis(alpha.11 + beta.2 - c.3),
           C12_2 = plogis(alpha.12 + beta.2 - c.2) - plogis(alpha.12 + beta.2 - c.3),
           C13_2 = plogis(alpha.13 + beta.2 - c.2) - plogis(alpha.13 + beta.2 - c.3),
           C14_2 = plogis(alpha.14 + beta.2 - c.2) - plogis(alpha.14 + beta.2 - c.3),
           C15_2 = plogis(alpha.15 + beta.2 - c.2) - plogis(alpha.15 + beta.2 - c.3),
           C16_2 = plogis(alpha.16 + beta.2 - c.2) - plogis(alpha.16 + beta.2 - c.3),
           C17_2 = plogis(alpha.17 + beta.2 - c.2) - plogis(alpha.17 + beta.2 - c.3),
           C18_2 = plogis(alpha.18 + beta.2 - c.2) - plogis(alpha.18 + beta.2 - c.3),
           C19_2 = plogis(alpha.19 + beta.2 - c.2) - plogis(alpha.19 + beta.2 - c.3),
           C20_2 = plogis(alpha.20 + beta.2 - c.2) - plogis(alpha.20 + beta.2 - c.3),
           C21_2 = plogis(alpha.21 + beta.2 - c.2) - plogis(alpha.21 + beta.2 - c.3),
           C22_2 = plogis(alpha.22 + beta.2 - c.2) - plogis(alpha.22 + beta.2 - c.3),
           C23_2 = plogis(alpha.23 + beta.2 - c.2) - plogis(alpha.23 + beta.2 - c.3),
           C24_2 = plogis(alpha.24 + beta.2 - c.2) - plogis(alpha.24 + beta.2 - c.3),
           C25_2 = plogis(alpha.25 + beta.2 - c.2) - plogis(alpha.25 + beta.2 - c.3),
           DFW1_1 = plogis(alpha.1 + beta.1 - c.3),
           DFW2_1 = plogis(alpha.2 + beta.1 - c.3),
           DFW3_1 = plogis(alpha.3 + beta.1 - c.3),
           DFW4_1 = plogis(alpha.4 + beta.1 - c.3),
           DFW5_1 = plogis(alpha.5 + beta.1 - c.3),
           DFW6_1 = plogis(alpha.6 + beta.1 - c.3),
           DFW7_1 = plogis(alpha.7 + beta.1 - c.3),
           DFW8_1 = plogis(alpha.8 + beta.1 - c.3),
           DFW9_1 = plogis(alpha.9 + beta.1 - c.3),
           DFW10_1 = plogis(alpha.10 + beta.1 - c.3),
           DFW11_1 = plogis(alpha.11 + beta.1 - c.3),
           DFW12_1 = plogis(alpha.12 + beta.1 - c.3),
           DFW13_1 = plogis(alpha.13 + beta.1 - c.3),
           DFW14_1 = plogis(alpha.14 + beta.1 - c.3),
           DFW15_1 = plogis(alpha.15 + beta.1 - c.3),
           DFW16_1 = plogis(alpha.16 + beta.1 - c.3),
           DFW17_1 = plogis(alpha.17 + beta.1 - c.3),
           DFW18_1 = plogis(alpha.18 + beta.1 - c.3),
           DFW19_1 = plogis(alpha.19 + beta.1 - c.3),
           DFW20_1 = plogis(alpha.20 + beta.1 - c.3),
           DFW21_1 = plogis(alpha.21 + beta.1 - c.3),
           DFW22_1 = plogis(alpha.22 + beta.1 - c.3),
           DFW23_1 = plogis(alpha.23 + beta.1 - c.3),
           DFW24_1 = plogis(alpha.24 + beta.1 - c.3),
           DFW25_1 = plogis(alpha.25 + beta.1 - c.3),
           DFW1_2 = plogis(alpha.1 + beta.2 - c.3),
           DFW2_2 = plogis(alpha.2 + beta.2 - c.3),
           DFW3_2 = plogis(alpha.3 + beta.2 - c.3),
           DFW4_2 = plogis(alpha.4 + beta.2 - c.3),
           DFW5_2 = plogis(alpha.5 + beta.2 - c.3),
           DFW6_2 = plogis(alpha.6 + beta.2 - c.3),
           DFW7_2 = plogis(alpha.7 + beta.2 - c.3),
           DFW8_2 = plogis(alpha.8 + beta.2 - c.3),
           DFW9_2 = plogis(alpha.9 + beta.2 - c.3),
           DFW10_2 = plogis(alpha.10 + beta.2 - c.3),
           DFW11_2 = plogis(alpha.11 + beta.2 - c.3),
           DFW12_2 = plogis(alpha.12 + beta.2 - c.3),
           DFW13_2 = plogis(alpha.13 + beta.2 - c.3),
           DFW14_2 = plogis(alpha.14 + beta.2 - c.3),
           DFW15_2 = plogis(alpha.15 + beta.2 - c.3),
           DFW16_2 = plogis(alpha.16 + beta.2 - c.3),
           DFW17_2 = plogis(alpha.17 + beta.2 - c.3),
           DFW18_2 = plogis(alpha.18 + beta.2 - c.3),
           DFW19_2 = plogis(alpha.19 + beta.2 - c.3),
           DFW20_2 = plogis(alpha.20 + beta.2 - c.3),
           DFW21_2 = plogis(alpha.21 + beta.2 - c.3),
           DFW22_2 = plogis(alpha.22 + beta.2 - c.3),
           DFW23_2 = plogis(alpha.23 + beta.2 - c.3),
           DFW24_2 = plogis(alpha.24 + beta.2 - c.3),
           DFW25_2 = plogis(alpha.25 + beta.2 - c.3))
ord_mm_tidyA_12
ord_mm_tidy_diffA_12 <- ord_mm_tidyA_12 %>%
    transmute(A1_diff = A1_2 - A1_1,
              A2_diff = A2_2 - A2_1,
              A3_diff = A3_2 - A3_1,
              A4_diff = A4_2 - A4_1,
              A5_diff = A5_2 - A5_1,
              A6_diff = A6_2 - A6_1,
              A7_diff = A7_2 - A7_1,
              A8_diff = A8_2 - A8_1,
              A9_diff = A9_2 - A9_1,
              A10_diff = A10_2 - A10_1,
              A11_diff = A11_2 - A11_1,
              A12_diff = A12_2 - A12_1,
              A13_diff = A13_2 - A13_1,
              A14_diff = A14_2 - A14_1,
              A15_diff = A15_2 - A15_1,
              A16_diff = A16_2 - A16_1,
              A17_diff = A17_2 - A17_1,
              A18_diff = A18_2 - A18_1,
              A19_diff = A19_2 - A19_1,
              A20_diff = A20_2 - A20_1,
              A21_diff = A21_2 - A21_1,
              A22_diff = A22_2 - A22_1,
              A23_diff = A23_2 - A23_1,
              A24_diff = A24_2 - A24_1,
              A25_diff = A25_2 - A25_1,
              B1_diff = B1_2 - B1_1,
              B2_diff = B2_2 - B2_1,
              B3_diff = B3_2 - B3_1,
              B4_diff = B4_2 - B4_1,
              B5_diff = B5_2 - B5_1,
              B6_diff = B6_2 - B6_1,
              B7_diff = B7_2 - B7_1,
              B8_diff = B8_2 - B8_1,
              B9_diff = B9_2 - B9_1,
              B10_diff = B10_2 - B10_1,
              B11_diff = B11_2 - B11_1,
              B12_diff = B12_2 - B12_1,
              B13_diff = B13_2 - B13_1,
              B14_diff = B14_2 - B14_1,
              B15_diff = B15_2 - B15_1,
              B16_diff = B16_2 - B16_1,
              B17_diff = B17_2 - B17_1,
              B18_diff = B18_2 - B18_1,
              B19_diff = B19_2 - B19_1,
              B20_diff = B20_2 - B20_1,
              B21_diff = B21_2 - B21_1,
              B22_diff = B22_2 - B22_1,
              B23_diff = B23_2 - B23_1,
              B24_diff = B24_2 - B24_1,
              B25_diff = B25_2 - B25_1,
              C1_diff = C1_2 - C1_1,
              C2_diff = C2_2 - C2_1,
              C3_diff = C3_2 - C3_1,
              C4_diff = C4_2 - C4_1,
              C5_diff = C5_2 - C5_1,
              C6_diff = C6_2 - C6_1,
              C7_diff = C7_2 - C7_1,
              C8_diff = C8_2 - C8_1,
              C9_diff = C9_2 - C9_1,
              C10_diff = C10_2 - C10_1,
              C11_diff = C11_2 - C11_1,
              C12_diff = C12_2 - C12_1,
              C13_diff = C13_2 - C13_1,
              C14_diff = C14_2 - C14_1,
              C15_diff = C15_2 - C15_1,
              C16_diff = C16_2 - C16_1,
              C17_diff = C17_2 - C17_1,
              C18_diff = C18_2 - C18_1,
              C19_diff = C19_2 - C19_1,
              C20_diff = C20_2 - C20_1,
              C21_diff = C21_2 - C21_1,
              C22_diff = C22_2 - C22_1,
              C23_diff = C23_2 - C23_1,
              C24_diff = C24_2 - C24_1,
              C25_diff = C25_2 - C25_1,
              DFW1_diff = DFW1_2 - DFW1_1,
              DFW2_diff = DFW2_2 - DFW2_1,
              DFW3_diff = DFW3_2 - DFW3_1,
              DFW4_diff = DFW4_2 - DFW4_1,
              DFW5_diff = DFW5_2 - DFW5_1,
              DFW6_diff = DFW6_2 - DFW6_1,
              DFW7_diff = DFW7_2 - DFW7_1,
              DFW8_diff = DFW8_2 - DFW8_1,
              DFW9_diff = DFW9_2 - DFW9_1,
              DFW10_diff = DFW10_2 - DFW10_1,
              DFW11_diff = DFW11_2 - DFW11_1,
              DFW12_diff = DFW12_2 - DFW12_1,
              DFW13_diff = DFW13_2 - DFW13_1,
              DFW14_diff = DFW14_2 - DFW14_1,
              DFW15_diff = DFW15_2 - DFW15_1,
              DFW16_diff = DFW16_2 - DFW16_1,
              DFW17_diff = DFW17_2 - DFW17_1,
              DFW18_diff = DFW18_2 - DFW18_1,
              DFW19_diff = DFW19_2 - DFW19_1,
              DFW20_diff = DFW20_2 - DFW20_1,
              DFW21_diff = DFW21_2 - DFW21_1,
              DFW22_diff = DFW22_2 - DFW22_1,
              DFW23_diff = DFW23_2 - DFW23_1,
              DFW24_diff = DFW24_2 - DFW24_1,
              DFW25_diff = DFW25_2 - DFW25_1)
ord_mm_tidy_diffA_12
ord_mm_long_diffA_12 <- ord_mm_tidy_diffA_12 %>%
    pivot_longer(cols = starts_with(c("A", "B", "C", "DFW")),
                 names_to = "grade_diff",
                 values_to = "prop")
ord_mm_long_diffA_12
ord_mm_long_diff_groupedA_12 <- ord_mm_long_diffA_12 %>%
  mutate(grade_diff_grouped = case_when(str_detect(grade_diff, "^A") ~ "A",
                                        str_detect(grade_diff, "^B") ~ "B",
                                        str_detect(grade_diff, "^C") ~ "C",
                                        str_detect(grade_diff, "^DFW") ~ "DFW"))
ord_mm_long_diff_groupedA_12
ord_mm_long_diff_groupedA_12 %>%
    ggplot(aes(y = fct_rev(grade_diff_grouped), x = prop)) +
        stat_halfeye() +
    geom_vline(xintercept = 0, color = "blue")

Phase 1 to Phase 3

ord_mm_tidyA_13 <- ord_mm_fitA_13 %>%
    spread_draws(alpha[..], beta[..], c[..]) %>%
    mutate(or = exp(beta.1 - beta.2),
           A1_1 = 1 - plogis(alpha.1 + beta.1 - c.1),
           A2_1 = 1 - plogis(alpha.2 + beta.1 - c.1),
           A3_1 = 1 - plogis(alpha.3 + beta.1 - c.1),
           A4_1 = 1 - plogis(alpha.4 + beta.1 - c.1),
           A5_1 = 1 - plogis(alpha.5 + beta.1 - c.1),
           A6_1 = 1 - plogis(alpha.6 + beta.1 - c.1),
           A7_1 = 1 - plogis(alpha.7 + beta.1 - c.1),
           A8_1 = 1 - plogis(alpha.8 + beta.1 - c.1),
           A9_1 = 1 - plogis(alpha.9 + beta.1 - c.1),
           A10_1 = 1 - plogis(alpha.10 + beta.1 - c.1),
           A11_1 = 1 - plogis(alpha.11 + beta.1 - c.1),
           A1_3 = 1 - plogis(alpha.1 + beta.2 - c.1),
           A2_3 = 1 - plogis(alpha.2 + beta.2 - c.1),
           A3_3 = 1 - plogis(alpha.3 + beta.2 - c.1),
           A4_3 = 1 - plogis(alpha.4 + beta.2 - c.1),
           A5_3 = 1 - plogis(alpha.5 + beta.2 - c.1),
           A6_3 = 1 - plogis(alpha.6 + beta.2 - c.1),
           A7_3 = 1 - plogis(alpha.7 + beta.2 - c.1),
           A8_3 = 1 - plogis(alpha.8 + beta.2 - c.1),
           A9_3 = 1 - plogis(alpha.9 + beta.2 - c.1),
           A10_3 = 1 - plogis(alpha.10 + beta.2 - c.1),
           A11_3 = 1 - plogis(alpha.11 + beta.2 - c.1),
           B1_1 = plogis(alpha.1 + beta.1 - c.1) - plogis(alpha.1 + beta.1 - c.2),
           B2_1 = plogis(alpha.2 + beta.1 - c.1) - plogis(alpha.2 + beta.1 - c.2),
           B3_1 = plogis(alpha.3 + beta.1 - c.1) - plogis(alpha.3 + beta.1 - c.2),
           B4_1 = plogis(alpha.4 + beta.1 - c.1) - plogis(alpha.4 + beta.1 - c.2),
           B5_1 = plogis(alpha.5 + beta.1 - c.1) - plogis(alpha.5 + beta.1 - c.2),
           B6_1 = plogis(alpha.6 + beta.1 - c.1) - plogis(alpha.6 + beta.1 - c.2),
           B7_1 = plogis(alpha.7 + beta.1 - c.1) - plogis(alpha.7 + beta.1 - c.2),
           B8_1 = plogis(alpha.8 + beta.1 - c.1) - plogis(alpha.8 + beta.1 - c.2),
           B9_1 = plogis(alpha.9 + beta.1 - c.1) - plogis(alpha.9 + beta.1 - c.2),
           B10_1 = plogis(alpha.10 + beta.1 - c.1) - plogis(alpha.10 + beta.1 - c.2),
           B11_1 = plogis(alpha.11 + beta.1 - c.1) - plogis(alpha.11 + beta.1 - c.2),
           B1_3 = plogis(alpha.1 + beta.2 - c.1) - plogis(alpha.1 + beta.2 - c.2),
           B2_3 = plogis(alpha.2 + beta.2 - c.1) - plogis(alpha.2 + beta.2 - c.2),
           B3_3 = plogis(alpha.3 + beta.2 - c.1) - plogis(alpha.3 + beta.2 - c.2),
           B4_3 = plogis(alpha.4 + beta.2 - c.1) - plogis(alpha.4 + beta.2 - c.2),
           B5_3 = plogis(alpha.5 + beta.2 - c.1) - plogis(alpha.5 + beta.2 - c.2),
           B6_3 = plogis(alpha.6 + beta.2 - c.1) - plogis(alpha.6 + beta.2 - c.2),
           B7_3 = plogis(alpha.7 + beta.2 - c.1) - plogis(alpha.7 + beta.2 - c.2),
           B8_3 = plogis(alpha.8 + beta.2 - c.1) - plogis(alpha.8 + beta.2 - c.2),
           B9_3 = plogis(alpha.9 + beta.2 - c.1) - plogis(alpha.9 + beta.2 - c.2),
           B10_3 = plogis(alpha.10 + beta.2 - c.1) - plogis(alpha.10 + beta.2 - c.2),
           B11_3 = plogis(alpha.11 + beta.2 - c.1) - plogis(alpha.11 + beta.2 - c.2),
           C1_1 = plogis(alpha.1 + beta.1 - c.2) - plogis(alpha.1 + beta.1 - c.3),
           C2_1 = plogis(alpha.2 + beta.1 - c.2) - plogis(alpha.2 + beta.1 - c.3),
           C3_1 = plogis(alpha.3 + beta.1 - c.2) - plogis(alpha.3 + beta.1 - c.3),
           C4_1 = plogis(alpha.4 + beta.1 - c.2) - plogis(alpha.4 + beta.1 - c.3),
           C5_1 = plogis(alpha.5 + beta.1 - c.2) - plogis(alpha.5 + beta.1 - c.3),
           C6_1 = plogis(alpha.6 + beta.1 - c.2) - plogis(alpha.6 + beta.1 - c.3),
           C7_1 = plogis(alpha.7 + beta.1 - c.2) - plogis(alpha.7 + beta.1 - c.3),
           C8_1 = plogis(alpha.8 + beta.1 - c.2) - plogis(alpha.8 + beta.1 - c.3),
           C9_1 = plogis(alpha.9 + beta.1 - c.2) - plogis(alpha.9 + beta.1 - c.3),
           C10_1 = plogis(alpha.10 + beta.1 - c.2) - plogis(alpha.10 + beta.1 - c.3),
           C11_1 = plogis(alpha.11 + beta.1 - c.2) - plogis(alpha.11 + beta.1 - c.3),
           C1_3 = plogis(alpha.1 + beta.2 - c.2) - plogis(alpha.1 + beta.2 - c.3),
           C2_3 = plogis(alpha.2 + beta.2 - c.2) - plogis(alpha.2 + beta.2 - c.3),
           C3_3 = plogis(alpha.3 + beta.2 - c.2) - plogis(alpha.3 + beta.2 - c.3),
           C4_3 = plogis(alpha.4 + beta.2 - c.2) - plogis(alpha.4 + beta.2 - c.3),
           C5_3 = plogis(alpha.5 + beta.2 - c.2) - plogis(alpha.5 + beta.2 - c.3),
           C6_3 = plogis(alpha.6 + beta.2 - c.2) - plogis(alpha.6 + beta.2 - c.3),
           C7_3 = plogis(alpha.7 + beta.2 - c.2) - plogis(alpha.7 + beta.2 - c.3),
           C8_3 = plogis(alpha.8 + beta.2 - c.2) - plogis(alpha.8 + beta.2 - c.3),
           C9_3 = plogis(alpha.9 + beta.2 - c.2) - plogis(alpha.9 + beta.2 - c.3),
           C10_3 = plogis(alpha.10 + beta.2 - c.2) - plogis(alpha.10 + beta.2 - c.3),
           C11_3 = plogis(alpha.11 + beta.2 - c.2) - plogis(alpha.11 + beta.2 - c.3),
           DFW1_1 = plogis(alpha.1 + beta.1 - c.3),
           DFW2_1 = plogis(alpha.2 + beta.1 - c.3),
           DFW3_1 = plogis(alpha.3 + beta.1 - c.3),
           DFW4_1 = plogis(alpha.4 + beta.1 - c.3),
           DFW5_1 = plogis(alpha.5 + beta.1 - c.3),
           DFW6_1 = plogis(alpha.6 + beta.1 - c.3),
           DFW7_1 = plogis(alpha.7 + beta.1 - c.3),
           DFW8_1 = plogis(alpha.8 + beta.1 - c.3),
           DFW9_1 = plogis(alpha.9 + beta.1 - c.3),
           DFW10_1 = plogis(alpha.10 + beta.1 - c.3),
           DFW11_1 = plogis(alpha.11 + beta.1 - c.3),
           DFW1_3 = plogis(alpha.1 + beta.2 - c.3),
           DFW2_3 = plogis(alpha.2 + beta.2 - c.3),
           DFW3_3 = plogis(alpha.3 + beta.2 - c.3),
           DFW4_3 = plogis(alpha.4 + beta.2 - c.3),
           DFW5_3 = plogis(alpha.5 + beta.2 - c.3),
           DFW6_3 = plogis(alpha.6 + beta.2 - c.3),
           DFW7_3 = plogis(alpha.7 + beta.2 - c.3),
           DFW8_3 = plogis(alpha.8 + beta.2 - c.3),
           DFW9_3 = plogis(alpha.9 + beta.2 - c.3),
           DFW10_3 = plogis(alpha.10 + beta.2 - c.3),
           DFW11_3 = plogis(alpha.11 + beta.2 - c.3))
ord_mm_tidyA_13
ord_mm_tidy_diffA_13 <- ord_mm_tidyA_13 %>%
    transmute(A1_diff = A1_3 - A1_1,
              A2_diff = A2_3 - A2_1,
              A3_diff = A3_3 - A3_1,
              A4_diff = A4_3 - A4_1,
              A5_diff = A5_3 - A5_1,
              A6_diff = A6_3 - A6_1,
              A7_diff = A7_3 - A7_1,
              A8_diff = A8_3 - A8_1,
              A9_diff = A9_3 - A9_1,
              A10_diff = A10_3 - A10_1,
              A11_diff = A11_3 - A11_1,
              B1_diff = B1_3 - B1_1,
              B2_diff = B2_3 - B2_1,
              B3_diff = B3_3 - B3_1,
              B4_diff = B4_3 - B4_1,
              B5_diff = B5_3 - B5_1,
              B6_diff = B6_3 - B6_1,
              B7_diff = B7_3 - B7_1,
              B8_diff = B8_3 - B8_1,
              B9_diff = B9_3 - B9_1,
              B10_diff = B10_3 - B10_1,
              B11_diff = B11_3 - B11_1,
              C1_diff = C1_3 - C1_1,
              C2_diff = C2_3 - C2_1,
              C3_diff = C3_3 - C3_1,
              C4_diff = C4_3 - C4_1,
              C5_diff = C5_3 - C5_1,
              C6_diff = C6_3 - C6_1,
              C7_diff = C7_3 - C7_1,
              C8_diff = C8_3 - C8_1,
              C9_diff = C9_3 - C9_1,
              C10_diff = C10_3 - C10_1,
              C11_diff = C11_3 - C11_1,
              DFW1_diff = DFW1_3 - DFW1_1,
              DFW2_diff = DFW2_3 - DFW2_1,
              DFW3_diff = DFW3_3 - DFW3_1,
              DFW4_diff = DFW4_3 - DFW4_1,
              DFW5_diff = DFW5_3 - DFW5_1,
              DFW6_diff = DFW6_3 - DFW6_1,
              DFW7_diff = DFW7_3 - DFW7_1,
              DFW8_diff = DFW8_3 - DFW8_1,
              DFW9_diff = DFW9_3 - DFW9_1,
              DFW10_diff = DFW10_3 - DFW10_1,
              DFW11_diff = DFW11_3 - DFW11_1)
ord_mm_tidy_diffA_13
ord_mm_long_diffA_13 <- ord_mm_tidy_diffA_13 %>%
    pivot_longer(cols = starts_with(c("A", "B", "C", "DFW")),
                 names_to = "grade_diff",
                 values_to = "prop")
ord_mm_long_diffA_13
ord_mm_long_diff_groupedA_13 <- ord_mm_long_diffA_13 %>%
  mutate(grade_diff_grouped = case_when(str_detect(grade_diff, "^A") ~ "A",
                                        str_detect(grade_diff, "^B") ~ "B",
                                        str_detect(grade_diff, "^C") ~ "C",
                                        str_detect(grade_diff, "^DFW") ~ "DFW"))
ord_mm_long_diff_groupedA_13
ord_mm_long_diff_groupedA_13 %>%
    ggplot(aes(y = fct_rev(grade_diff_grouped), x = prop)) +
        stat_halfeye() +
    geom_vline(xintercept = 0, color = "blue")

Graphs for publication

Set theme for smaller graphs:

pub_theme_A = theme(text = element_text(size = 14),
                    plot.title = element_text(size = 16))
pub_theme_B = theme(text = element_text(size = 11),
                    plot.title = element_text(size = 14),
                    plot.subtitle = element_text(size = 11))

Grades

Phase 1 to Phase 2

Shows faculty with only Phase 1 and Phase 2 data.

d_all %>%
    filter(phase_coll == 1 | phase_coll == 2) %>%
    filter(faculty_ind > 11) %>%
    group_by(phase, faculty_ind, grade) %>%
    count() %>%
    group_by(phase, faculty_ind) %>%
    mutate(prop = n/sum(n)) %>%
    ggplot(aes(x = grade, y = prop)) +
        geom_bar(stat = "identity") +
        facet_grid(phase ~ faculty_ind )+
        labs(x = "Grade",
             y = "Proportion")

ggsave("./graphics/phase12_all_grades.pdf", device = "pdf", width = 8, height = 3)

Phase 1 to Phase 3

Shows faculty with all three phases.

d_all %>%
    filter(faculty_ind <= 11) %>%
    group_by(phase, faculty_ind, grade) %>%
    count() %>%
    group_by(phase, faculty_ind) %>%
    mutate(prop = n/sum(n)) %>%
    ggplot(aes(x = grade, y = prop)) +
        geom_bar(stat = "identity") +
        facet_grid(phase ~ faculty_ind )+
        labs(x = "Grade",
             y = "Proportion")

ggsave("./graphics/phase123_all_grades.pdf", device = "pdf", width = 8, height = 5)

Odds ratios

Model A

orA_12_post <- ggplot(ord_mm_tidyA_12, aes(x = or)) +
    geom_histogram(aes(y = after_stat(density))) +
    geom_vline(xintercept = 1, color = "blue") +
    labs(x = "Odds ratio",
         y = "Probability density",
         title = "Model A",
         subtitle = "Phase 1 to Phase 2") +
    pub_theme_A
orA_12_post

orA_13_post <- ggplot(ord_mm_tidyA_13, aes(x = or)) +
    geom_histogram(aes(y = after_stat(density))) +
    geom_vline(xintercept = 1, color = "blue") +
    labs(x = "Odds ratio",
         y = "Probability density",
         subtitle = "Phase 1 to Phase 3") +
    pub_theme_A
orA_13_post

orA_12_post + orA_13_post

ggsave("./graphics/orA_post.pdf", device = "pdf", width = 8, height = 3)

Model B

Phase 1 to Phase 2
orB_12_men_BHI_post <- ggplot(ord_mm_tidyB_12, aes(x = or_men_BHI)) +
    geom_histogram(aes(y = after_stat(density))) +
    geom_vline(xintercept = 1, color = "blue") +
    labs(x = "Odds ratio",
         y = "Probability density",
         title = "Model B, Phase 1 to Phase 2",
         subtitle = "Men: Black, Hispanic, or Indigenous") +
    pub_theme_B
orB_12_men_BHI_post

orB_12_women_BHI_post <- ggplot(ord_mm_tidyB_12, aes(x = or_women_BHI)) +
    geom_histogram(aes(y = after_stat(density))) +
    geom_vline(xintercept = 1, color = "blue") +
    labs(x = "Odds ratio",
         y = "Probability density",
         subtitle = "Women: Black, Hispanic, or Indigenous") +
    pub_theme_B
orB_12_women_BHI_post

orB_12_men_WA_post <- ggplot(ord_mm_tidyB_12, aes(x = or_men_WA)) +
    geom_histogram(aes(y = after_stat(density))) +
    geom_vline(xintercept = 1, color = "blue") +
    labs(x = "Odds ratio",
         y = "Probability density",
         subtitle = "Men: White or Asian") +
    pub_theme_B
orB_12_men_WA_post

orB_12_women_WA_post <- ggplot(ord_mm_tidyB_12, aes(x = or_women_WA)) +
    geom_histogram(aes(y = after_stat(density))) +
    geom_vline(xintercept = 1, color = "blue") +
    labs(x = "Odds ratio",
         y = "Probability density",
         subtitle = "Women: White or Asian") +
    pub_theme_B
orB_12_women_WA_post

(orB_12_men_BHI_post | orB_12_women_BHI_post) / (orB_12_men_WA_post | orB_12_women_WA_post)

ggsave("./graphics/orB_12_post.pdf", device = "pdf", width = 8, height = 5)
Phase 1 to Phase 3
orB_13_men_BHI_post <- ggplot(ord_mm_tidyB_13, aes(x = or_men_BHI)) +
    geom_histogram(aes(y = after_stat(density))) +
    geom_vline(xintercept = 1, color = "blue") +
    labs(x = "Odds ratio",
         y = "Probability density",
         title = "Model B, Phase 1 to Phase 3",
         subtitle = "Men: Black, Hispanic, or Indigenous") +
    pub_theme_B
orB_13_men_BHI_post

orB_13_women_BHI_post <- ggplot(ord_mm_tidyB_13, aes(x = or_women_BHI)) +
    geom_histogram(aes(y = after_stat(density))) +
    geom_vline(xintercept = 1, color = "blue") +
    labs(x = "Odds ratio",
         y = "Probability density",
         subtitle = "Women: Black, Hispanic, or Indigenous") +
    pub_theme_B
orB_13_women_BHI_post

orB_13_men_WA_post <- ggplot(ord_mm_tidyB_13, aes(x = or_men_WA)) +
    geom_histogram(aes(y = after_stat(density))) +
    geom_vline(xintercept = 1, color = "blue") +
    labs(x = "Odds ratio",
         y = "Probability density",
         subtitle = "Men: White or Asian") +
    pub_theme_B
orB_13_men_WA_post

orB_13_women_WA_post <- ggplot(ord_mm_tidyB_13, aes(x = or_women_WA)) +
    geom_histogram(aes(y = after_stat(density))) +
    geom_vline(xintercept = 1, color = "blue") +
    labs(x = "Odds ratio",
         y = "Probability density",
         subtitle = "Women: White or Asian") +
    pub_theme_B
orB_13_women_WA_post

(orB_13_men_BHI_post | orB_13_women_BHI_post) / (orB_13_men_WA_post | orB_13_women_WA_post)

ggsave("./graphics/orB_13_post.pdf", device = "pdf", width = 8, height = 5)

Faculy differences

Only for Model A.

prop_change12 <- ord_mm_long_diff_groupedA_12 %>%
    ggplot(aes(y = fct_rev(grade_diff_grouped), x = prop)) +
        stat_halfeye() +
    geom_vline(xintercept = 0, color = "blue") +
    labs(x = "Proportion change",
         y = "Grade",
         title = "Model A",
         subtitle = "Phase 1 to Phase 2") +
    pub_theme
prop_change12

prop_change13 <- ord_mm_long_diff_groupedA_13 %>%
    ggplot(aes(y = fct_rev(grade_diff_grouped), x = prop)) +
        stat_halfeye() +
    geom_vline(xintercept = 0, color = "blue") +
    labs(x = "Proportion change",
         y = "Grade",
         subtitle = "Phase 1 to Phase 3") +
    pub_theme
prop_change13

prop_change12 + prop_change13

ggsave("./graphics/prop_change.pdf", device = "pdf", width = 8, height = 4)
LS0tCnRpdGxlOiAiUE9HSUwgZGF0YSBhbmFseXNpcyAoYWxsIG11bHRpbGV2ZWwgbW9kZWxzIHdpdGggcmFjZSBhbmQgZ2VuZGVyKSIKYXV0aG9yOiAiU2VhbiBSYWxlaWdoIgpkYXRlOiAiQXByaWwgMTcsIDIwMjMiCm91dHB1dDoKICAgIGh0bWxfbm90ZWJvb2s6CiAgICAgICAgdG9jOiB5ZXMKICAgICAgICB0b2NfZmxvYXQ6IHllcwotLS0KCiMjIFByZWxpbWluYXJpZXMKCkxvYWQgcGFja2FnZXMuCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocnN0YW4pCmxpYnJhcnkodGlkeWJheWVzKQpsaWJyYXJ5KHBhdGNod29yaykKYGBgCgpTZXQgU3RhbiBvcHRpb25zOgoKYGBge3J9Cm9wdGlvbnMobWMuY29yZXMgPSBwYXJhbGxlbDo6ZGV0ZWN0Q29yZXMoKSkgIyBwYXJhbGxlbCBwcm9jCnJzdGFuX29wdGlvbnMoYXV0b193cml0ZSA9IFRSVUUpICMgYXZvaWQgcmVjb21waWxhdGlvbgpgYGAKCgojIyBJbXBvcnQgZGF0YQoKYGBge3J9CmRhdGFfcmF3IDwtIHJlYWRfY3N2KCJkYXRhLzIwMjMtMDEtMjEuY3N2IikKYGBgCgojIyBXcmFuZ2xlIGRhdGEKClJlbW92ZSB1bm5lZWRlZCB2YXJpYWJsZXMuCgpgYGB7cn0KZCA8LSBkYXRhX3JhdyAlPiUKICAgIHNlbGVjdCgtZmlsZW5hbWUsIC10ZXJtLCAtY29ob3J0LCAtY291cnNlKSAlPiUKICAgIGFycmFuZ2UoZmFjdWx0eSkKZCRmYWN1bHR5IDwtIGFzX2ZhY3RvcihkJGZhY3VsdHkpCmQKYGBgCgpgYGB7cn0KZCAlPiUKICBncm91cF9ieShmYWN1bHR5KSAlPiUKICBjb3VudCgpCmBgYAoKIyMjIER1cGxpY2F0ZSByb3dzCgpEdXBsaWNhdGUgcm93cyBhY2NvcmRpbmcgdG8gYGNvdW50YCB2YXJpYWJsZSB0byBjcmVhdGUgb25lIHJvdyBwZXIgc3R1ZGVudC4gCgpgYGB7cn0KZF9hbGwgPC0gZCAlPiUKICAgIHVuY291bnQoY291bnQpCmRfYWxsCmBgYAoKQ2hlY2sgdGhhdCB0aGVyZSBhcmUgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHJvd3M6CgpgYGB7cn0Kc3VtKGQkY291bnQpCk5ST1coZF9hbGwpCmBgYAoKIyMjIERyb3AgbWlzc2luZyByYWNlIGRhdGEKClNvbWUgb2YgdGhlIHJhY2UgZGF0YSBpcyBtaXNzaW5nLCBzbyB3ZSBoYXZlIHRvIGRyb3AgdGhvc2Ugcm93cy4KCmBgYHtyfQpOUk9XKGRfYWxsKQpkX2FsbCA8LSBkX2FsbCAlPiUKICBkcm9wX25hKCkKTlJPVyhkX2FsbCkKYGBgCgojIyMgQ29tYmluZSBwaGFzZXMKCmBgYHtyfQpkX2FsbCRwaGFzZV9jb2xsIDwtIGRfYWxsJHBoYXNlICU+JQogICAgZmN0X2NvbGxhcHNlKCIxIiA9IGMoIjFhIiwgIjFiIiksICIyIiA9ICIyYSIsICIzIiA9IGMoIjNhIiwgIjNiIikpCnRhYmxlKGRfYWxsJHBoYXNlKQp0YWJsZShkX2FsbCRwaGFzZV9jb2xsKQpgYGAKCiMjIyBDb2xsYXBzZSAiZmFpbGluZyIgZ3JhZGVzCgpgYGB7cn0KZF9hbGwkZ3JhZGVfY29sbCA8LSBkX2FsbCRncmFkZSAlPiUKICAgIGZjdF9jb2xsYXBzZShERlcgPSBjKCJEIiwgIkYiLCAiVyIpKQp0YWJsZShkX2FsbCRncmFkZSkKdGFibGUoZF9hbGwkZ3JhZGVfY29sbCkKYGBgCgpXZSdsbCBhbHNvIG5lZWQgdGhpcyB2YXJpYWJsZSBhcyBhIHNlcXVlbmNlIG9mIG51bWJlcnM6CgpgYGB7cn0KZF9hbGwgPC0gZF9hbGwgJT4lCiAgICBtdXRhdGUoZ3JhZGVfb3JkID0gYXMuaW50ZWdlcihncmFkZV9jb2xsKSkKdGFibGUoZF9hbGwkZ3JhZGVfb3JkKQpgYGAKCiMjIyBDb2xsYXBzZSByYWNlIHZhcmlhYmxlCgpgYGB7cn0KZF9hbGwgPC0gZF9hbGwgJT4lCiAgbXV0YXRlKHJhY2VfY29sbCA9IGlmZWxzZShyYWNlID09ICJub25VUk0iLCAiV2hpdGUgb3IgQXNpYW4iLCAiQmxhY2ssIEhpc3BhbmljLCBvciBJbmRpZ2Vub3VzIikpCnRhYmxlKGRfYWxsJHJhY2UpCnRhYmxlKGRfYWxsJHJhY2VfY29sbCkKYGBgCgojIyMgQ3JlYXRlIGluZGV4IHZhcmlhYmxlcyBmb3IgcGhhc2VzLCBmYWN1bHR5LCBnZW5kZXIsIGFuZCByYWNlCgojIyMjIFBoYXNlCgpUaGUgcGhhc2UgaW5kaWNhdG9yIGhhcyB0byBiZSAxIG9yIDIuIFBoYXNlIDEgd2lsbCBhbHdheXMgYmUgMSwgYnV0IGluIHRoZSB0d28gZGlmZmVyZW50IG1vZGVscywgdGhlIGNvbXBhcmlzb24gcGhhc2UgaXMgZWl0aGVyIFBoYXNlIDIgb3IgUGhhc2UgMy4gQm90aCB3aWxsIG5lZWQgdG8gYmUgbGFiZWxlZCB3aXRoIHRoZSBpbmRleCAyLgoKYGBge3J9CmRfYWxsIDwtIGRfYWxsICU+JQogIG11dGF0ZShwaGFzZV9pbmQgPSBpZmVsc2UocGhhc2VfY29sbCA9PSAxLCAxLCAyKSkKdGFibGUoZF9hbGwkcGhhc2VfY29sbCkKdGFibGUoZF9hbGwkcGhhc2VfaW5kKQpgYGAKCiMjIyMgRmFjdWx0eQoKQ3VycmVudGx5LCB0aGUgZmFjdWx0eSBhcmUgbnVtYmVyZWQgYXMgZm9sbG93czoKCmBgYHtyfQp0YWJsZShkX2FsbCRmYWN1bHR5KQpgYGAKClRoZSBgZmFjdWx0eWAgaXMgYSBmYWN0b3IgdmFyaWFibGUsIGJ1dCB3ZSdsbCBhbHNvIG5lZWQgYW4gaW50ZWdlciB2ZXJzaW9uLiBXZSdsbCBhbHNvIGRyb3AgdGhlIHVudXNlZCBsZXZlbHMgKGZhY3VsdHkgd2l0aCBubyByYWNlIGRhdGEgYXQgYWxsKS4KCmBgYHtyfQp0YWJsZShkX2FsbCRmYWN1bHR5KQpkX2FsbCRmYWN1bHR5IDwtIGZjdF9kcm9wKGRfYWxsJGZhY3VsdHkpCmRfYWxsIDwtIGRfYWxsICU+JQogIG11dGF0ZShmYWN1bHR5X2luZCA9IGFzLmludGVnZXIoYXNfZmFjdG9yKGZhY3VsdHkpKSkKdGFibGUoZF9hbGwkZmFjdWx0eV9pbmQpCmBgYAoKIyMjIyBHZW5kZXIKCmBgYHtyfQpsZXZlbHMoYXNfZmFjdG9yKGRfYWxsJGdlbmRlcikpCmBgYAoKU28gaW4gdGhlIGluZGV4IHZhcmlhYmxlLCAxID0gIm1lbiIgYW5kIDIgPSAid29tZW4iLgoKYGBge3J9CmRfYWxsIDwtIGRfYWxsICU+JQogIG11dGF0ZShnZW5kZXJfaW5kID0gYXMuaW50ZWdlcihhc19mYWN0b3IoZ2VuZGVyKSkpCnRhYmxlKGRfYWxsJGdlbmRlcikKdGFibGUoZF9hbGwkZ2VuZGVyX2luZCkKYGBgCgojIyMjIFJhY2UKCmBgYHtyfQpsZXZlbHMoYXNfZmFjdG9yKGRfYWxsJHJhY2VfY29sbCkpCmBgYAoKU28gaW4gdGhlIGluZGV4IHZhcmlhYmxlLCAxID0gIldoaXRlIG9yIEFzaWFuIiwgMiA9ICJCbGFjaywgSGlzcGFuaWMsIG9yIEluZGlnZW5vdXMiLgoKYGBge3J9CmRfYWxsIDwtIGRfYWxsICU+JQogIG11dGF0ZShyYWNlX2luZCA9IGFzLmludGVnZXIoYXNfZmFjdG9yKHJhY2VfY29sbCkpKQp0YWJsZShkX2FsbCRyYWNlX2NvbGwpCnRhYmxlKGRfYWxsJHJhY2VfaW5kKQpgYGAKCiMjIyBJbnRlcmFjdGlvbiB0ZXJtcwoKIyMjIyBQaGFzZV9nZW5kZXIKClRoZSBuZXcgYHBoYXNlX2dlbmRlcmAgdmFyaWFibGUgaXMgaW5kZXhlZCBhcyBmb2xsb3dzOgoKMS4gUGhhc2UgMSwgTWVuCjIuIFBoYXNlIDEsIFdvbWVuCjMuIFBoYXNlIDIvMywgTWVuCjQuIFBoYXNlIDIvMywgV29tZW4KCmBgYHtyfQpkX2FsbCA8LSBkX2FsbCAlPiUKICBtdXRhdGUocGhhc2VfZ2VuZGVyID0gY2FzZV93aGVuKHBoYXNlX2luZCA9PSAxICYgZ2VuZGVyX2luZCA9PSAxIH4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlX2luZCA9PSAxICYgZ2VuZGVyX2luZCA9PSAyIH4gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlX2luZCA9PSAyICYgZ2VuZGVyX2luZCA9PSAxIH4gMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlX2luZCA9PSAyICYgZ2VuZGVyX2luZCA9PSAyIH4gNCkpCnRhYmxlKGRfYWxsJHBoYXNlX2luZCwgZF9hbGwkZ2VuZGVyKQp0YWJsZShkX2FsbCRwaGFzZV9nZW5kZXIpCmBgYAoKIyMjIyBQaGFzZV9yYWNlCgpUaGUgbmV3IGBwaGFzZV9yYWNlYCB2YXJpYWJsZSBpcyBpbmRleGVkIGFzIGZvbGxvd3M6CgoxLiBQaGFzZSAxLCBXaGl0ZSBvciBBc2lhbgoyLiBQaGFzZSAxLCBCbGFjaywgSGlzcGFuaWMsIG9yIEluZGlnZW5vdXMKMy4gUGhhc2UgMi8zLCBXaGl0ZSBvciBBc2lhbgo0LiBQaGFzZSAyLzMsIEJsYWNrLCBIaXNwYW5pYywgb3IgSW5kaWdlbm91cwoKYGBge3J9CmRfYWxsIDwtIGRfYWxsICU+JQogIG11dGF0ZShwaGFzZV9yYWNlID0gY2FzZV93aGVuKHBoYXNlX2luZCA9PSAxICYgcmFjZV9pbmQgPT0gMSB+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhhc2VfaW5kID09IDEgJiByYWNlX2luZCA9PSAyIH4gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaGFzZV9pbmQgPT0gMiAmIHJhY2VfaW5kID09IDEgfiAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlX2luZCA9PSAyICYgcmFjZV9pbmQgPT0gMiB+IDQpKQp0YWJsZShkX2FsbCRwaGFzZV9pbmQsIGRfYWxsJHJhY2VfY29sbCkKdGFibGUoZF9hbGwkcGhhc2VfcmFjZSkKYGBgCgojIyMgQ29tcGxldGUgZGF0YSBzZXQKCmBgYHtyfQpkX2FsbApgYGAKCgojIyBFeHBsb3JhdG9yeSBkYXRhIGFuYWx5c2lzCgojIyMgR2VuZGVyCgpgYGB7cn0KZ2dwbG90KGRfYWxsLCBhZXMoeCA9IGdlbmRlcikpICsKICAgIGdlb21fYmFyKCkKYGBgCgojIyMgUmFjZQoKYGBge3J9CmdncGxvdChkX2FsbCwgYWVzKHggPSByYWNlKSkgKwogICAgZ2VvbV9iYXIoKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9hbGwsIGFlcyh4ID0gcmFjZV9jb2xsKSkgKwogICAgZ2VvbV9iYXIoKQpgYGAKCiMjIyBHcmFkZSBkaXN0cmlidXRpb25zCgojIyMjIEFsbCBsZXR0ZXIgZ3JhZGVzCgpBbGwgZ3JhZGVzIGdpdmVuIGFjcm9zcyB0aGUgZW50aXJlIHN0dWR5OgoKYGBge3J9CmdncGxvdChkX2FsbCwgYWVzKHggPSBncmFkZSkpICsKICAgIGdlb21fYmFyKCkKYGBgCgojIyMjIE92ZXJhbGwgZ3JhZGUgZGlzdHJpYnV0aW9ucyBmb3IgZWFjaCBwaGFzZQoKYGBge3J9CmdncGxvdChkX2FsbCwgYWVzKHggPSBncmFkZSkpICsKICAgIGdlb21fYmFyKCkgKwogICAgZmFjZXRfZ3JpZChwaGFzZSB+IC4pCmBgYAoKQXMgcHJvcG9ydGlvbnMgd2l0aGluIGVhY2ggcGhhc2U6CgpgYGB7cn0KZF9hbGwgJT4lCiAgICBncm91cF9ieShwaGFzZSwgZ3JhZGUpICU+JQogICAgY291bnQoKSAlPiUKICAgIGdyb3VwX2J5KHBoYXNlKSAlPiUKICAgIG11dGF0ZShwcm9wID0gbi9zdW0obikpICU+JQogICAgZ2dwbG90KGFlcyh4ID0gZ3JhZGUsIHkgPSBwcm9wKSkgKwogICAgICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgICAgICAgZmFjZXRfZ3JpZChwaGFzZSB+IC4pCmBgYAoKIyMjIyBHcmFkZSBkaXN0cmlidXRpb25zIGJ5IGZhY3VsdHkgYWNyb3NzIHBoYXNlcwoKYGBge3IsIGZpZy53aWR0aCA9IDh9CmdncGxvdChkX2FsbCwgYWVzKHggPSBncmFkZSkpICsKICAgIGdlb21fYmFyKCkgKwogICAgZmFjZXRfZ3JpZChwaGFzZSB+IGZhY3VsdHkpCmBgYAoKQXMgcHJvcG9ydGlvbnM6CgpgYGB7ciwgZmlnLndpZHRoID0gOH0KZF9hbGwgJT4lCiAgICBncm91cF9ieShwaGFzZSwgZmFjdWx0eSwgZ3JhZGUpICU+JQogICAgY291bnQoKSAlPiUKICAgIGdyb3VwX2J5KHBoYXNlLCBmYWN1bHR5KSAlPiUKICAgIG11dGF0ZShwcm9wID0gbi9zdW0obikpICU+JQogICAgZ2dwbG90KGFlcyh4ID0gZ3JhZGUsIHkgPSBwcm9wKSkgKwogICAgICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgICAgICAgZmFjZXRfZ3JpZChwaGFzZSB+IGZhY3VsdHkpCmBgYAoKIyMjIyBHcmFkZSBkaXN0cmlidXRpb25zIGJ5IGdlbmRlcgoKYGBge3IsIGZpZy53aWR0aCA9IDh9CmdncGxvdChkX2FsbCwgYWVzKHggPSBncmFkZV9jb2xsKSkgKwogICAgZ2VvbV9iYXIoKSArCiAgICBmYWNldF9ncmlkKHBoYXNlX2NvbGwgfiBnZW5kZXIpCmBgYAoKQXMgcHJvcG9ydGlvbnM6CgpgYGB7ciwgZmlnLndpZHRoID0gOH0KZF9hbGwgJT4lCiAgICBncm91cF9ieShwaGFzZV9jb2xsLCBnZW5kZXIsIGdyYWRlX2NvbGwpICU+JQogICAgY291bnQoKSAlPiUKICAgIGdyb3VwX2J5KHBoYXNlX2NvbGwsIGdlbmRlcikgJT4lCiAgICBtdXRhdGUocHJvcCA9IG4vc3VtKG4pKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IGdyYWRlX2NvbGwsIHkgPSBwcm9wKSkgKwogICAgICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgICAgICAgZmFjZXRfZ3JpZChwaGFzZV9jb2xsIH4gZ2VuZGVyKQpgYGAKCgpDaGVjayB0aGUgbnVtYmVyczoKClBoYXNlIDEgdG8gUGhhc2UgMjoKCmBgYHtyfQpkX2FsbCAlPiUKICAgIGZpbHRlcihwaGFzZV9jb2xsID09IDEgfCBwaGFzZV9jb2xsID09IDIpICU+JQogICAgZ3JvdXBfYnkoZ3JhZGVfY29sbCwgZ2VuZGVyLCBwaGFzZV9jb2xsKSAlPiUKICAgIGNvdW50KCkgJT4lCiAgICBncm91cF9ieShwaGFzZV9jb2xsLCBnZW5kZXIpICU+JQogICAgbXV0YXRlKHByb3AgPSBuL3N1bShuKSkKYGBgCgpgYGB7cn0KZF9hbGwgJT4lCiAgICBmaWx0ZXIocGhhc2VfY29sbCA9PSAxIHwgcGhhc2VfY29sbCA9PSAyKSAlPiUKICAgIGdyb3VwX2J5KGdyYWRlX2NvbGwsIGdlbmRlciwgcGhhc2VfY29sbCkgJT4lCiAgICBjb3VudCgpICU+JQogICAgZ3JvdXBfYnkocGhhc2VfY29sbCwgZ2VuZGVyKSAlPiUKICAgIG11dGF0ZShwcm9wID0gbi9zdW0obikpICU+JQogIGdncGxvdChhZXMoeSA9IHByb3AsIHggPSBwaGFzZV9jb2xsKSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGZhY2V0X2dyaWQoZ2VuZGVyIH4gZ3JhZGVfY29sbCkKYGBgCgpQaGFzZSAxIHRvIFBoYXNlIDM6CgpgYGB7cn0KZF9hbGwgJT4lCiAgICBmaWx0ZXIocGhhc2VfY29sbCA9PSAxIHwgcGhhc2VfY29sbCA9PSAzKSAlPiUKICAgIGdyb3VwX2J5KGdyYWRlX2NvbGwsIGdlbmRlciwgcGhhc2VfY29sbCkgJT4lCiAgICBjb3VudCgpICU+JQogICAgZ3JvdXBfYnkocGhhc2VfY29sbCwgZ2VuZGVyKSAlPiUKICAgIG11dGF0ZShwcm9wID0gbi9zdW0obikpCmBgYAoKYGBge3J9CmRfYWxsICU+JQogICAgZmlsdGVyKHBoYXNlX2NvbGwgPT0gMSB8IHBoYXNlX2NvbGwgPT0gMykgJT4lCiAgICBncm91cF9ieShncmFkZV9jb2xsLCBnZW5kZXIsIHBoYXNlX2NvbGwpICU+JQogICAgY291bnQoKSAlPiUKICAgIGdyb3VwX2J5KHBoYXNlX2NvbGwsIGdlbmRlcikgJT4lCiAgICBtdXRhdGUocHJvcCA9IG4vc3VtKG4pKSAlPiUKICBnZ3Bsb3QoYWVzKHkgPSBwcm9wLCB4ID0gcGhhc2VfY29sbCkpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBmYWNldF9ncmlkKGdlbmRlciB+IGdyYWRlX2NvbGwpCmBgYAoKIyMjIyBHcmFkZSBkaXN0cmlidXRpb25zIGJ5IHJhY2UKCmBgYHtyLCBmaWcud2lkdGggPSA4fQpnZ3Bsb3QoZF9hbGwsIGFlcyh4ID0gZ3JhZGVfY29sbCkpICsKICAgIGdlb21fYmFyKCkgKwogICAgZmFjZXRfZ3JpZChwaGFzZV9jb2xsIH4gcmFjZV9jb2xsKQpgYGAKCkFzIHByb3BvcnRpb25zOgoKYGBge3IsIGZpZy53aWR0aCA9IDh9CmRfYWxsICU+JQogICAgZ3JvdXBfYnkocGhhc2VfY29sbCwgcmFjZV9jb2xsLCBncmFkZV9jb2xsKSAlPiUKICAgIGNvdW50KCkgJT4lCiAgICBncm91cF9ieShwaGFzZV9jb2xsLCByYWNlX2NvbGwpICU+JQogICAgbXV0YXRlKHByb3AgPSBuL3N1bShuKSkgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSBncmFkZV9jb2xsLCB5ID0gcHJvcCkpICsKICAgICAgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogICAgICAgIGZhY2V0X2dyaWQocGhhc2VfY29sbCB+IHJhY2VfY29sbCkKYGBgCgpDaGVjayB0aGUgbnVtYmVyczoKClBoYXNlIDEgdG8gUGhhc2UgMjoKCmBgYHtyfQpkX2FsbCAlPiUKICAgIGZpbHRlcihwaGFzZV9jb2xsID09IDEgfCBwaGFzZV9jb2xsID09IDIpICU+JQogICAgZ3JvdXBfYnkoZ3JhZGVfY29sbCwgcmFjZV9jb2xsLCBwaGFzZV9jb2xsKSAlPiUKICAgIGNvdW50KCkgJT4lCiAgICBncm91cF9ieShwaGFzZV9jb2xsLCByYWNlX2NvbGwpICU+JQogICAgbXV0YXRlKHByb3AgPSBuL3N1bShuKSkKYGBgCgpgYGB7cn0KZF9hbGwgJT4lCiAgICBmaWx0ZXIocGhhc2VfY29sbCA9PSAxIHwgcGhhc2VfY29sbCA9PSAyKSAlPiUKICAgIGdyb3VwX2J5KGdyYWRlX2NvbGwsIHJhY2VfY29sbCwgcGhhc2VfY29sbCkgJT4lCiAgICBjb3VudCgpICU+JQogICAgZ3JvdXBfYnkocGhhc2VfY29sbCwgcmFjZV9jb2xsKSAlPiUKICAgIG11dGF0ZShwcm9wID0gbi9zdW0obikpICU+JQogIGdncGxvdChhZXMoeSA9IHByb3AsIHggPSBwaGFzZV9jb2xsKSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGZhY2V0X2dyaWQocmFjZV9jb2xsIH4gZ3JhZGVfY29sbCkKYGBgCgpQaGFzZSAxIHRvIFBoYXNlIDM6CgpgYGB7cn0KZF9hbGwgJT4lCiAgICBmaWx0ZXIocGhhc2VfY29sbCA9PSAxIHwgcGhhc2VfY29sbCA9PSAzKSAlPiUKICAgIGdyb3VwX2J5KGdyYWRlX2NvbGwsIHJhY2VfY29sbCwgcGhhc2VfY29sbCkgJT4lCiAgICBjb3VudCgpICU+JQogICAgZ3JvdXBfYnkocGhhc2VfY29sbCwgcmFjZV9jb2xsKSAlPiUKICAgIG11dGF0ZShwcm9wID0gbi9zdW0obikpCmBgYAoKYGBge3J9CmRfYWxsICU+JQogICAgZmlsdGVyKHBoYXNlX2NvbGwgPT0gMSB8IHBoYXNlX2NvbGwgPT0gMykgJT4lCiAgICBncm91cF9ieShncmFkZV9jb2xsLCByYWNlX2NvbGwsIHBoYXNlX2NvbGwpICU+JQogICAgY291bnQoKSAlPiUKICAgIGdyb3VwX2J5KHBoYXNlX2NvbGwsIHJhY2VfY29sbCkgJT4lCiAgICBtdXRhdGUocHJvcCA9IG4vc3VtKG4pKSAlPiUKICBnZ3Bsb3QoYWVzKHkgPSBwcm9wLCB4ID0gcGhhc2VfY29sbCkpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBmYWNldF9ncmlkKHJhY2VfY29sbCB+IGdyYWRlX2NvbGwpCmBgYAoKCiMjIEZpbHRlciBkYXRhIGZvciBwaGFzZSBhbmFseXNpcwoKYGBge3J9CiMgUGhhc2UgMSBhbmQgUGhhc2UgMiBkYXRhCmRfZmluYWxfMTIgPC0gZF9hbGwgJT4lCiAgZmlsdGVyKGFzLmludGVnZXIocGhhc2VfY29sbCkgPT0gMSB8IGFzLmludGVnZXIocGhhc2VfY29sbCkgPT0gMikKCiMgT25seSBmYWN1bHR5IGxhYmVsZWQgMS0xMSBoYXZlIFBoYXNlIDMgZGF0YQpkX2ZpbmFsXzEzIDwtIGRfYWxsICU+JQogIGZpbHRlcihhcy5pbnRlZ2VyKHBoYXNlX2NvbGwpID09IDEgfCBhcy5pbnRlZ2VyKHBoYXNlX2NvbGwpID09IDMpICU+JQogIGZpbHRlcihhcy5pbnRlZ2VyKGZhY3VsdHkpID49IDEgJiBhcy5pbnRlZ2VyKGZhY3VsdHkpIDw9IDExKQoKYGBgCgpEcm9wIHVudXNlZCBsZXZlbHMgb2YgYHBoYXNlX2NvbGxgIGFuZCBgZmFjdWx0eWA6CgpgYGB7cn0KZF9maW5hbF8xMiRwaGFzZV9jb2xsIDwtIGZjdF9kcm9wKGRfZmluYWxfMTIkcGhhc2VfY29sbCkKZF9maW5hbF8xMyRwaGFzZV9jb2xsIDwtIGZjdF9kcm9wKGRfZmluYWxfMTMkcGhhc2VfY29sbCkKZF9maW5hbF8xMiRmYWN1bHR5IDwtIGZjdF9kcm9wKGRfZmluYWxfMTIkZmFjdWx0eSkKZF9maW5hbF8xMyRmYWN1bHR5IDwtIGZjdF9kcm9wKGRfZmluYWxfMTMkZmFjdWx0eSkKYGBgCgojIyMgRmluYWwgZGF0YSBzZXRzCgpgYGB7cn0KZF9maW5hbF8xMgpgYGAKCmBgYHtyfQpzdHIoZF9maW5hbF8xMikKYGBgCgpgYGB7cn0KZF9maW5hbF8xMwpgYGAKCmBgYHtyfQpzdHIoZF9maW5hbF8xMykKYGBgCgojIyMgRmluYWwgc3VtbWFyeSB0YWJsZXMKCmBgYHtyfQp0YWJsZShkX2FsbCRnZW5kZXIsIGRfYWxsJHJhY2UpCmBgYAoKCmBgYHtyfQp0YWJsZShkX2ZpbmFsXzEyJHJhY2VfY29sbCwgZF9maW5hbF8xMiRnZW5kZXIsIGRfZmluYWxfMTIkcGhhc2VfaW5kKQpgYGAKCmBgYHtyfQp0YWJsZShkX2ZpbmFsXzEyJHJhY2VfY29sbCwgZF9maW5hbF8xMiRnZW5kZXIsIGRfZmluYWxfMTIkcGhhc2VfaW5kKSAlPiUKICBwcm9wLnRhYmxlKG1hcmdpbiA9IDMpCmBgYAoKYGBge3J9CnRhYmxlKGRfZmluYWxfMTMkcmFjZV9jb2xsLCBkX2ZpbmFsXzEzJGdlbmRlciwgZF9maW5hbF8xMyRwaGFzZV9pbmQpCmBgYAoKYGBge3J9CnRhYmxlKGRfZmluYWxfMTMkcmFjZV9jb2xsLCBkX2ZpbmFsXzEzJGdlbmRlciwgZF9maW5hbF8xMyRwaGFzZV9pbmQpICU+JQogIHByb3AudGFibGUobWFyZ2luID0gMykKYGBgCgojIyBNb2RlbHMKClRoZSBvcmRpbmFsIHJlZ3Jlc3Npb24gbW9kZWwgYXNzdW1lcyBhIGNvbnRpbnVvdXMgbGF0ZW50IGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIHdpdGggImN1dHBvaW50cyIgdGhhdCBnZW5lcmF0ZSBvcmRpbmFsIGNhdGVnb3JpZXMuIEZvciBncmFkZXMsIHRoaXMgbWFrZXMgYSBsb3Qgb2Ygc2Vuc2UsIGFzIHRoZSBjb250aW51b3VzIGRpc3RyaWJ1dGlvbiBvZiBwb2ludHMgaXMgY29udmVydGVkIGludG8gZGlzY3JldGUgb3JkZXJlZCBncmFkZXMuCgpTdXBwb3NlIHRoZXJlIGFyZSAkSyA+IDIkIGNhdGVnb3JpZXMgaW4gb3VyIG9yZGluYWwgcmVzcG9uc2UgJFkkLiAoRm9yIHRoZSBncmFkZSBkYXRhLCAkSyA9IDQkLikgTGV0ICRjJCBiZSBhIHZlY3RvciBvZiBsZW5ndGggJEsgKyAxJCB3aXRoICRjX3swfSA9IC1caW5mdHkkLCAkY197S30gPSBcaW5mdHkkLCBhbmQgJGNfezF9IDwgY197Mn0gPCBcZG90cyA8IGNfe0stMX0kLiBGaW5hbGx5LCBsZXQgJFxldGEkIGJlIGEgcmVhbCBudW1iZXIuIFRoZW4gZm9yICQxIFxsZXEgayBcbGVxIEskLCB0aGUgb3JkZXJlZCBsb2dpc3RpYyBkaXN0cmlidXRpb24gaXMgZ2l2ZW4gYnkKCiQkCk9yZExvZyhrIFxtaWQgXGV0YSwgYykgPSBpbnZsb2dpdChcZXRhIC0gY197ayAtIDF9KSAtIGludmxvZ2l0KFxldGEgLSBjX3trfSkKJCQKd2hlcmUgJGludmxvZ2l0JCBpcyB0aGUgaW52ZXJzZSBsb2dpdCBmdW5jdGlvbiAoc29tZXRpbWVzIGNhbGxlZCB0aGUgKmxvZ2lzdGljKiBmdW5jdGlvbik6CgokJAppbnZsb2dpdCh4KSA9IFxmcmFje2Vee3h9fXsxICsgZV57eH19LgokJAoKTm90ZSB0aGF0ICRpbnZsb2dpdCgtXGluZnR5KSA9IDAkIGFuZCAkaW52bG9naXQoXGluZnR5KSA9IDEkLgoKJE9yZExvZyhrIFxtaWQgXGV0YSwgYykkIGlzIHRoZSBwcm9iYWJpbGl0eSAoZ2l2ZW4gdGhlIG1vZGVsKSBvZiB0aGUgb3JkaW5hbCByZXNwb25zZSB2YXJpYWJsZSB0YWtpbmcgdGhlIHZhbHVlICRrJDogJFByKFkgPSBrKSQuIChBbHRob3VnaCAkWSQgY29uc2lzdHMgb2Ygb3JkZXJlZCBjYXRlZ29yaWVzLCB0aGVzZSBjYXRlZ29yaWVzIGFyZSBhc3NpZ25lZCBpbnRlZ2VycyBmb3IgY29udmVuaWVuY2UgaW4gd3JpdGluZyBkb3duIHRoZSBtb2RlbCBtYXRoZW1hdGljYWxseS4gVGhlIG1vZGVsIGRvZXMgKm5vdCogYXNzdW1lIHRoYXQgdGhlIGNhdGVnb3JpZXMgYXJlIGVxdWFsbHkgc3BhY2VkLikKClRoaXMgaXMgbm90IHRoZSBtb3N0IG5hdHVyYWwgcGFyYW1ldGVyaXphdGlvbiBvZiB0aGUgb3JkaW5hbCByZWdyZXNzaW9uIG1vZGVsLCBidXQgaXQncyB0aGUgb25lIFN0YW4gdXNlcywgc28gd2UncmUgc3R1Y2sgd2l0aCBpdC4gV2UgY2FuIHJlLWV4cHJlc3MgdGhlIG1vZGVsIG90aGVyIHdheXMgdGhhdCBhcmUgZWFzaWVyIHRvIHVuZGVyc3RhbmQuIEZpcnN0LCBub3RlIHRoYXQgdGhlIGludmVyc2UgbG9naXQgZnVuY3Rpb24gcmVwcmVzZW50cyB0aGUgY3VtdWxhdGl2ZSBwcm9iYWJpbGl0eSBvZiBhIGxvZ2lzdGljIGRpc3RyaWJ1dGVkIHJhbmRvbSB2YXJpYWJsZSAkWCQ7IGluIG90aGVyIHdvcmRzLAoKJCQKaW52bG9naXQoeCkgPSBQcihYIFxsZXEgeCkKJCQKd2hlcmUKJCQKWCBcc2ltIExvZ2lzdGljKDAsIDEpLgokJAoKUmVwbGFjaW5nICR4JCB3aXRoICRcZXRhIC0gY197ay0xfSQgYW5kIHVzaW5nIHRoZSBpZGVudGl0eSAkaW52bG9naXQoLXgpID0gMSAtIGludmxvZ2l0KHgpJDoKClxiZWdpbnthbGlnbip9ClByKFkgPSBrKSAgJj0gIGludmxvZ2l0KFxldGEgLSBjX3trIC0gMX0pIC0gaW52bG9naXQoXGV0YSAtIGNfe2t9KSAgICAgICAgICAgICAgICAgXFwKICAgICY9IFxsZWZ0KCAxIC0gaW52bG9naXQoY197ayAtIDF9IC0gXGV0YSkgXHJpZ2h0KSAtIFxsZWZ0KCAxIC0gaW52bG9naXQoY197a30gLSBcZXRhKSBccmlnaHQpICAgXFwKICAgICY9IGludmxvZ2l0KGNfe2t9IC0gXGV0YSkgLSBpbnZsb2dpdChjX3trIC0gMX0gLSBcZXRhKQpcZW5ke2FsaWduKn0KCk9uZSBjYW4gc2hvdyAoZWl0aGVyIHVzaW5nIGFsZ2VicmEgYW5kIHRoZSBleHByZXNzaW9uIGFib3ZlLCBvciB0aGlua2luZyBhYm91dCAkaW52bG9naXQkIGFzIGEgY3VtdWxhdGl2ZSBwcm9iYWJpbGl0eSkgdGhhdAoKJCQKUHIoWSBcbGVxIGspID0gaW52bG9naXQoY197a30gLSBcZXRhKQokJAoKVGFraW5nIHRoZSBsb2dpdCBmdW5jdGlvbiAobG9nIG9kZHMpIG9uIGJvdGggc2lkZXMsIHdlIGdldCBhbiBlcXVpdmFsZW50IGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIGEgbGluZWFyIG1vZGVsIHByZWRpY3RpbmcgdGhlIGN1bXVsYXRpdmUgbG9nIG9kZHMgb2YgdGhlIG9yZGluYWwgcmVzcG9uc2UsIG1lYW5pbmcgdGhlIGxvZyBvZGRzIG9mIGJlaW5nIGluIGNhdGVnb3J5ICRrJCAqb3IgbG93ZXIqLgoKJCQKbG9naXQoUHIoWSBcbGVxIGspKSA9IFxsb2dcbGVmdCggXGZyYWN7UHIoWSBcbGVxIGspfXtQcihZID4gayl9IFxyaWdodCkgPSBjX3trfSAtIFxldGEKJCQKCkJhc2VkIG9uIHRoZSB3YXkgZ3JhZGVzIGFyZSBwYXJhbWV0ZXJpemVkLCBob3dldmVyLCBsb3dlciB2YWx1ZXMgb2YgJGskIGFyZSBhY3R1YWxseSAqYmV0dGVyKiBncmFkZXMuIEZvciBleGFtcGxlLCB0aGUgZXZlbnQgJFkgXGxlcSAyJCByZWZlcnMgdG8gZ3JhZGVzIG9mIEIgb3IgQS4KClRoZSBlZmZlY3Qgb2YgJFxldGEkIGlzIGFzIGZvbGxvd3M6IGlmICRcZXRhID4gMCQsIHRoZW4gdGhlIGxvZyBvZGRzLS0tYW5kLCB0aGVyZWZvcmUsIHRoZSBwcm9iYWJpbGl0eS0tLW9mIGJlaW5nIGluIGNhdGVnb3J5ICRrJCBvciBsb3dlciAobWVhbmluZyBoaWdoZXIgZ3JhZGVzKSB3aWxsIGJlIHNtYWxsZXIuIFRoaXMgc2hpZnRzIHByb2JhYmlsaXR5IHRvIGhpZ2hlci1udW1iZXJlZCBjYXRlZ29yaWVzLiBJbiBvdGhlciB3b3JkcywgbGFyZ2VyIHZhbHVlcyBvZiAkXGV0YSQgd2lsbCBjb3JyZXNwb25kIHRvIG1vcmUgcHJvYmFiaWxpdHkgYXNzaWduZWQgdG8gaGlnaGVyLW51bWJlcmVkIGNhdGVnb3JpZXMgb2YgdGhlIHJlc3BvbnNlIChjb3JyZXNwb25kaW5nIHRvIGxvd2VyIGdyYWRlcykuIExpa2V3aXNlLCBuZWdhdGl2ZSB2YWx1ZXMgb2YgJFxldGEkIHdpbGwgc2hpZnQgbW9yZSBwcm9iYWJpbGl0eSBvbnRvIHRoZSBsb3dlci1udW1iZXJlZCBjYXRlZ29yaWVzIChoaWdoZXIgZ3JhZGVzKS4gT25lIGltcG9ydGFudCBwb2ludCB0byBtYWtlIGlzIHRoYXQgJFxldGEkIGRvZXMgbm90IGRlcGVuZCBvbiAkayQuIFRoZSAic2hpZnQiIGluIGxvZy1vZGRzIGlzIGFzc3VtZWQgYnkgdGhlIG1vZGVsIHRvIGJlIGNvbnN0YW50IGFjcm9zcyBhbGwgdmFsdWVzIG9mICRrJC4gVGhpcyBpcyBjYWxsZWQgdGhlICJwcm9wb3J0aW9uYWwgb2RkcyIgYXNzdW1wdGlvbiBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcXVhdGlvbjoKCiQkClxmcmFje1ByKFkgXGxlcSBrKX17UHIoWSA+IGspfSA9IGVeeyhjX3trfSAtIFxldGEpfSA9IGVee2Nfe2t9fSBlXntcZXRhfQokJAoKSW4gZ2VuZXJhbCwgcHJlZGljdG9ycyBpbiB0aGUgbW9kZWwgd2lsbCBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgJFxldGEkIHRlcm0uIEluIHRoaXMgZGF0YSwgd2UgaGF2ZSB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgY29kZWQgYXMgaW5kZXggdmFyaWFibGVzIChvbmUgdmFyaWFibGUgZm9yIGVhY2ggZ3JvdXAgaW4gdGhlIGRhdGEpOgoKKiAkXGFscGhhX3tmYWN1bHR5fSQ6IEVhY2ggZmFjdWx0eSBwYXJ0aWNpcGFudCBoYXMgYSBwYXJhbWV0ZXIuIFRoZXNlIGFyZSBzbyBjYWxsZWQgInJhbmRvbSBlZmZlY3RzIiBhbmQgYXJlIG1vZGVsZWQgaGllcmFyY2hpY2FsbHkgdXNpbmcgYSBub3JtYWwgaHlwZXJwcmlvcjogJFxhbHBoYSBcc2ltIE5vcm1hbChcYmFye1xhbHBoYX0sIFxzaWdtYSkkLiBUaGUgcmVzdWx0IHdpbGwgYmUgYSBwYXJ0aWFsIHBvb2xpbmcgb2YgdGhlIHJlc3VsdHMgYWNyb3NzIGZhY3VsdHkuCiogJFxiZXRhX3twaGFzZX0kOiBFYWNoIHBoYXNlIGhhcyBhIHBhcmFtZXRlci4gVGhlcmUgYXJlIHR3byBwaGFzZXMuIEluIG9uZSBtb2RlbCwgdGhleSBhcmUgUGhhc2UgMSBhbmQgUGhhc2UgMi4gSW4gdGhlIG90aGVyIG1vZGVsLCB0aGV5IGFyZSBQaGFzZSAxIGFuZCBQaGFzZSAzLgoqICRcZ2FtbWFfe2dlbmRlcn0kOiBHZW5kZXJzIGFyZSAibWVuIiBhbmQgIndvbWVuIi4KKiAkXHJob197cmFjZX0kOiBSYWNpYWwgY2F0ZWdvcmllcyBhcmUgIkJsYWNrLCBIaXNwYW5pYywgb3IgSW5kaWdlbm91cyIgYW5kICJXaGl0ZSBvciBBc2lhbiIuCiogJFxkZWx0YV97cGhhc2UvZ2VuZGVyfSQ6IFRoZXNlIGFyZSBpbnRlcmFjdGlvbiB0ZXJtcyB0aGF0IG1vZGVsIGRldmlhdGlvbnMgZnJvbSB0aGUgbWFpbiBlZmZlY3RzIGZvciBwaGFzZSBhbmQgZ2VuZGVyLiAoVGhlcmUgYXJlIGZvdXIgc3VjaCB0ZXJtcywgb25lIGZvciBlYWNoIGNvbWJpbmF0aW9uIG9mIHBoYXNlIGFuZCBnZW5kZXIuKQoqICRcemV0YV97cGhhc2UvcmFjZX0kOiBUaGVzZSBhcmUgaW50ZXJhY3Rpb24gdGVybXMgdGhhdCBtb2RlbCBkZXZpYXRpb25zIGZyb20gdGhlIG1haW4gZWZmZWN0cyBmb3IgcGhhc2UgYW5kIHJhY2UuIChUaGVyZSBhcmUgZm91ciBzdWNoIHRlcm1zLCBvbmUgZm9yIGVhY2ggY29tYmluYXRpb24gb2YgcGhhc2UgYW5kIHJhY2UuKQoKVGhlcmUgYXJlIHR3byBtb2RlbHMgd2UgYXJlIGNvbnNpZGVyaW5nLiBUaGUgZmlyc3QgbW9kZWwgKE1vZGVsIEEpIHVzZXMKCiQkClxldGEgPSBcYWxwaGFfe2ZhY3VsdHl9ICsgXGJldGFfe3BoYXNlfQokJAoKVGhpcyBtb2RlbCB3aWxsIG1lYXN1cmUgdGhlIGF2ZXJhZ2UgZWZmZWN0IGJldHdlZW4gcGhhc2VzIGFuZCB3aWxsIGFsbG93IHVzIHRvIHN1bW1hcml6ZSBpbmZlcmVuY2VzIGFib3V0IGdyYWRlIGNoYW5nZXMgZm9yIGluZGl2aWR1YWwgZmFjdWx0eSBhbmQgZm9yIGFsbCBmYWN1bHR5IGNvbGxlY3RpdmVseS4KClRoZSBzZWNvbmQgbW9kZWwgKE1vZGVsIEIpIHdpbGwgY29uc2lkZXIgYWxsIHByZWRpY3RvcnMsIGluY29ycG9yYXRpbmcgcmFjZSBhbmQgZ2VuZGVyLCBpbmNsdWRpbmcgaW50ZXJhY3Rpb24gdGVybXMgd2l0aCBwaGFzZToKCiQkClxldGEgPSBcYWxwaGFfe2ZhY3VsdHl9ICsgXGJldGFfe3BoYXNlfSArIFxnYW1tYV97Z2VuZGVyfSArIFxyaG9fe3JhY2V9ICsgXGRlbHRhX3twaGFzZS9nZW5kZXJ9ICsgXHpldGFfe3BoYXNlL3JhY2V9CiQkCgpNb2RlbCBCIHdpbGwgbWVhc3VyZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGdlbmRlciBhbmQgcmFjZSBjYXRlZ29yaWVzLiBJbiB0aGVvcnksIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byByZWNvdmVyIE1vZGVsIEEgZnJvbSBNb2RlbCBCIGJ5IG1hcmdpbmFsaXppbmcgb3ZlciBnZW5kZXIgYW5kIHJhY2UuIEhvd2V2ZXIsIHRoZSBwYXJhbWV0ZXJpemF0aW9uIG9mIHRoZSBpbnRlcmFjdGlvbiB0ZXJtcyBpbiBNb2RlbCBCIG1ha2VzIGl0IGNvbXB1dGF0aW9uYWxseSBkaWZmaWN1bHQgdG8gcGVyZm9ybSB0aGF0IG1hcmdpbmFsaXphdGlvbi4gVGhlcmVmb3JlLCB3ZSBvcHQgdG8gcnVuIGJvdGggTW9kZWwgQSBhbmQgTW9kZWwgQi4KClN1cHBvc2UgdGhhdCAkWV97MX0kIGlzIHRoZSBvcmRpbmFsIHJlc3BvbnNlIChncmFkZXMpIGZvciBQaGFzZSAxIGFuZCAkWV97an0kIGlzIHRoZSBvcmRpbmFsIHJlc3BvbnNlIGZvciBlaXRoZXIgUGhhc2UgMiBvciBQaGFzZSAzICgkaiA9IDIgXHRleHR7IG9yIH0gMyQpLiBGb3IgZWFjaCBjdXRwb2ludCAkY197a30kOgoKJCQKXGV0YSA9IGNfe2t9IC0gbG9naXQoUHIoWSBcbGVxIGspKS4KJCQKCkluIE1vZGVsIEEsIHdlIHRoZW4gaGF2ZSB0aGUgZm9sbG93aW5nIGVxdWF0aW9ucyAoZm9yIGFsbCBmYWN1bHR5KToKClxiZWdpbnthbGlnbip9ClxiZXRhX3sxfSAmPSBjX3trfSAtIFxhbHBoYV97ZmFjdWx0eX0gLSBsb2dpdChQcihZX3sxfSBcbGVxIGspKSBcXApcYmV0YV97an0gJj0gY197a30gLSBcYWxwaGFfe2ZhY3VsdHl9IC0gbG9naXQoUHIoWV97an0gXGxlcSBrKSkKXGVuZHthbGlnbip9CgpXZSBjYW4gc3VidHJhY3QgdGhlc2UgdHdvIGVxdWF0aW9ucyB0byBvYnRhaW4KClxiZWdpbnthbGlnbip9ClxiZXRhX3sxfSAtIFxiZXRhX3tqfSAmPSBsb2dpdChQcihZX3tqfSBcbGVxIGspKSAtIGxvZ2l0KFByKFlfezF9IFxsZXEgaykpIFxcCiAgJj0gbG9nXGxlZnQoIFxmcmFje1ByKFlfe2p9IFxsZXEgayl9e1ByKFlfe2p9ID4gayl9IFxyaWdodCkgLSBsb2dcbGVmdCggXGZyYWN7UHIoWV97MX0gXGxlcSBrKX17UHIoWV97MX0gPiBrKX0gXHJpZ2h0KSBcXAogICAgJj0gbG9nXGxlZnQoIFxmcmFje1ByKFlfe2p9IFxsZXEgaykvUHIoWV97an0gPiBrKX17UHIoWV97MX0gXGxlcSBrKS9QcihZX3sxfSA+IGspfSBccmlnaHQpClxlbmR7YWxpZ24qfQoKVGhlcmVmb3JlLCB3ZSBjYW4gZXhwb25lbnRpYXRlIHRoZSBleHByZXNzaW9uIG9uIHRoZSBsZWZ0IHRvIGdldCB0aGUgb2RkcyByYXRpbyBmcm9tIFBoYXNlIDEgdG8gUGhhc2UgMi8zLgoKQW4gb2RkcyByYXRpbyBvZiAxIGluZGljYXRlcyB0aGF0IHRoZSBncmFkZSBkaXN0cmlidXRpb24gZG9lcyBub3QgY2hhbmdlIGZyb20gb25lIHBoYXNlIHRvIHRoZSBuZXh0LiBBbiBvZGRzIHJhdGlvIGdyZWF0ZXIgdGhhbiAxIGluZGljYXRlcyB0aGF0IGdyYWRlcyAqaW1wcm92ZWQqIGZyb20gUGhhc2UgMSB0byBQaGFzZSAkaiQuIEFuIG9kZHMgcmF0aW8gbGVzcyB0aGFuIDEgaW5kaWNhdGVzIHRoYXQgZ3JhZGVzICpkZWNyZWFzZWQqIGZyb20gUGhhc2UgMSB0byBQaGFzZSAkaiQuIFRoZSBwcm9wb3J0aW9uYWwgb2RkcyBhc3N1bXB0aW9uIGZvcmNlcyB0aGlzIG9kZHMgcmF0aW8gdG8gYmUgdGhlIHNhbWUgYXQgYWxsIGdyYWRlIGxldmVscy4gQWx0aG91Z2ggdGhpcyBpcyByYXJlbHkgYSByZWFsaXN0aWMgYXNzdW1wdGlvbiwgdGhlIG1vZGVsIGVmZmVjdGl2ZWx5IGF2ZXJhZ2VzIG92ZXIgYW55IGRpZmZlcmVuY2VzIGZyb20gb25lIGdyYWRlIGxldmVsIHRvIHRoZSBuZXh0IHRvIGVuZm9yY2UgdGhpcyBhc3N1bXB0aW9uLgoKSW4gTW9kZWwgQiwgd2UgaGF2ZSB0aGUgZm9sbG93aW5nIGVxdWF0aW9ucyBmb3IgZWFjaCB2YWx1ZSBvZiBmYWN1bHR5LCBnZW5kZXIsIGFuZCByYWNlOgoKXGJlZ2lue2FsaWduKn0KXGJldGFfezF9ICsgXGRlbHRhX3sxL2dlbmRlcn0gKyBcemV0YV97MS9yYWNlfSAmPSBjX3trfSAtIFxhbHBoYV97ZmFjdWx0eX0gLQogIFxnYW1tYV97Z2VuZGVyfSAtIFxyaG9fe3JhY2V9IC0gbG9naXQoUHIoWV97MX0gXGxlcSBrKSkgXFwKXGJldGFfe2p9ICsgXGRlbHRhX3tqL2dlbmRlcn0gKyBcemV0YV97ai9yYWNlfSAmPSBjX3trfSAtIFxhbHBoYV97ZmFjdWx0eX0gLQogIFxnYW1tYV97Z2VuZGVyfSAtIFxyaG9fe3JhY2V9IC0gbG9naXQoUHIoWV97an0gXGxlcSBrKSkKXGVuZHthbGlnbip9CgpXZSBjYW4gc3VidHJhY3QgdGhlc2UgdHdvIGVxdWF0aW9ucyB0byBvYnRhaW4KClxiZWdpbnthbGlnbip9ClxiZXRhX3sxfSAtIFxiZXRhX3tqfSArIFxkZWx0YV97MS9nZW5kZXJ9IC0gXGRlbHRhX3tqL2dlbmRlcn0gKyBcemV0YV97MS9yYWNlfSAtIFx6ZXRhX3tqL3JhY2V9CiAgJj0gbG9naXQoUHIoWV97an0gXGxlcSBrKSkgLSBsb2dpdChQcihZX3sxfSBcbGVxIGspKSBcXAogICY9IGxvZ1xsZWZ0KCBcZnJhY3tQcihZX3tqfSBcbGVxIGspfXtQcihZX3tqfSA+IGspfSBccmlnaHQpIC0gbG9nXGxlZnQoIFxmcmFje1ByKFlfezF9IFxsZXEgayl9e1ByKFlfezF9ID4gayl9IFxyaWdodCkgXFwKICAgICY9IGxvZ1xsZWZ0KCBcZnJhY3tQcihZX3tqfSBcbGVxIGspL1ByKFlfe2p9ID4gayl9e1ByKFlfezF9IFxsZXEgaykvUHIoWV97MX0gPiBrKX0gXHJpZ2h0KQpcZW5ke2FsaWduKn0KCkp1c3QgYXMgYmVmb3JlLCB3ZSBjYW4gZXhwb25lbnRpYXRlIHRoZSBleHByZXNzaW9uIG9uIHRoZSBsZWZ0IHRvIGdldCB0aGUgb2RkcyByYXRpbyBmcm9tIFBoYXNlIDEgdG8gUGhhc2UgMi8zIGZvciBidXQgbm93IGZvciBhbnkgY29tYmluYXRpb24gb2YgZ2VuZGVyIGFuZCByYWNlLgoKQXMgdGhpcyBpcyBhIEJheWVzaWFuIGFuYWx5c2lzLCB3ZSBtdXN0IHNwZWNpZnkgcHJpb3JzIGZvciBhbGwgcGFyYW1ldGVycy4gV2UgY2hvb3NlIGZhaXJseSBnZW5lcmljLCB3ZWFrbHktaW5mb3JtYXRpdmUgcHJpb3JzLiBBcyB0aGV5IGFyZSBjZW50ZXJlZCBhdCAwLCB0aGV5IHdpbGwgYWxzbyBzZXJ2ZSBhcyByZWd1bGFyaXppbmcgcHJpb3JzLiAoVGhlIGRhdGEgaXMgc3VmZmljaWVudCBpbiB0aGlzIHN0dWR5IHRoYXQgdGhleSB3aWxsIG92ZXJ3aGVsbSBqdXN0IGFib3V0IGFueSBzZW5zaWJsZSBjaG9pY2Ugb2YgcHJpb3IuKSBUaGUgcHJpb3JzIGFyZSBhcyBmb2xsb3dzOgoKXGJlZ2lue2FsaWduKn0KICBcYWxwaGFfe2ZhY3VsdHl9ICAgICAgJlxzaW0gTm9ybWFsKFxiYXJ7XGFscGhhfSwgXHNpZ21hKSAgICBcXAogIFxiYXJ7XGFscGhhfSAgICAgICAgICAmXHNpbSBOb3JtYWwoMCwgMSkgICAgICAgICAgICAgICAgICAgIFxcCiAgXHNpZ21hICAgICAgICAgICAgICAgICZcc2ltIEV4cG9uZW50aWFsKDEpICAgICAgICAgICAgICAgICAgXFwKICBcYmV0YV97cGhhc2V9ICAgICAgICAgJlxzaW0gTm9ybWFsKDAsIDEpICAgICAgICAgICAgICAgICAgICBcXAogIFxnYW1tYV97Z2VuZGVyfSAgICAgICAmXHNpbSBOb3JtYWwoMCwgMSkgICAgICAgICAgICAgICAgICAgIFxcCiAgXHJob197cmFjZX0gICAgICAgICAgICZcc2ltIE5vcm1hbCgwLCAxKSAgICAgICAgICAgICAgICAgICAgXFwKICBcZGVsdGFfe3BoYXNlL2dlbmRlcn0gJlxzaW0gTm9ybWFsKDAsIDEpICAgICAgICAgICAgICAgICAgICBcXAogIFx6ZXRhX3twaGFzZS9yYWNlfSAgICAmXHNpbSBOb3JtYWwoMCwgMSkgICAgICAgICAgICAgICAgICAgIFxcClxlbmR7YWxpZ24qfQoKVGhlIGNvbXBvbmVudHMgb2YgdGhlIGN1dHBvaW50IHZlY3RvciBhcmUgZWFjaCBhc3NpZ25lZCBhIHVuaWZvcm0gcHJpb3IgYnkgU3RhbiAod2hpY2ggaXMgdHJ1bmNhdGVkIGJhc2VkIG9uIHRoZSBjb25zdHJhaW50cyBpbiB0aGUgb3JkZXJpbmcpLgoKIyMjIE11bHRpbGV2ZWwgbW9kZWxzIGluIFN0YW4KCiMjIyMgTW9kZWwgQQoKYGBge3N0YW4sIG91dHB1dC52YXIgPSAib3JkX21tX21vZGVsQSIsIGNhY2hlID0gVFJVRX0KZGF0YSB7CiAgaW50PGxvd2VyPTA+IE47ICAgICAgICAgICAgICAgICAgICAgLy8gc2FtcGxlIHNpemUKICBpbnQ8bG93ZXI9MSwgdXBwZXI9Mj4gcGhhc2VfaW5kW05dOyAvLyB0d28gcGhhc2VzCiAgaW50PGxvd2VyPTI+IEo7ICAgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGZhY3VsdHkKICBpbnQ8bG93ZXI9MT4gZmFjdWx0eV9pbmRbTl07ICAgICAgICAvLyBmYWN1bHR5IGFycmF5CiAgaW50PGxvd2VyPTI+IEs7ICAgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGdyYWRlIGNhdGVnLgogIGludDxsb3dlcj0xLCB1cHBlcj1LPiB5W05dOyAgICAgICAgIC8vIGdyYWRlIGNvZGVzCn0KcGFyYW1ldGVycyB7CiAgcmVhbCBhbHBoYV9iYXI7CiAgcmVhbDxsb3dlcj0wPiBzaWdtYTsKICByZWFsIGFscGhhW0pdOwogIHJlYWwgYmV0YVsyXTsKICBvcmRlcmVkW0sgLSAxXSBjOwp9Cm1vZGVsIHsKICBhbHBoYV9iYXIgfiBub3JtYWwoMCwgMSk7CiAgc2lnbWEgfiBleHBvbmVudGlhbCgxKTsKICBhbHBoYSB+IG5vcm1hbChhbHBoYV9iYXIsIHNpZ21hKTsKICBiZXRhIH4gbm9ybWFsKDAsIDEpOwogIGZvciAobiBpbiAxOk4pIHsKICAgIHJlYWwgZXRhOwogICAgZXRhID0gYWxwaGFbZmFjdWx0eV9pbmRbbl1dICsgYmV0YVtwaGFzZV9pbmRbbl1dOwogICAgeVtuXSB+IG9yZGVyZWRfbG9naXN0aWMoZXRhLCBjKTsKICB9Cn0KYGBgCgojIyMjIyBQaGFzZSAxIHRvIFBoYXNlIDIKClRoZSBkYXRhIGxpc3Q6CgpgYGB7cn0Kb3JkX21tX2RhdGFBXzEyIDwtIGxpc3QoCiAgICBOID0gTlJPVyhkX2ZpbmFsXzEyKSwgICAgICAgICAgICAgIAogICAgcGhhc2VfaW5kID0gZF9maW5hbF8xMiRwaGFzZV9pbmQsCiAgICBKID0gbmxldmVscyhkX2ZpbmFsXzEyJGZhY3VsdHkpLCAgCiAgICBmYWN1bHR5X2luZCA9IGRfZmluYWxfMTIkZmFjdWx0eV9pbmQsCiAgICBLID0gbmxldmVscyhkX2ZpbmFsXzEyJGdyYWRlX2NvbGwpLCAKICAgIHkgPSBkX2ZpbmFsXzEyJGdyYWRlX29yZAopCmBgYAoKRml0IHRoZSBtb2RlbDoKCmBgYHtyLCBjYWNoZSA9IFRSVUV9Cm9yZF9tbV9maXRBXzEyIDwtIHNhbXBsaW5nKG9yZF9tbV9tb2RlbEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBvcmRfbW1fZGF0YUFfMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIgPSA4MDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVkID0gMTExMTQpCmBgYAoKQ29lZmZpY2llbnRzIG9mIHRoZSBtb2RlbDoKCmBgYHtyfQpzdW1tYXJ5KG9yZF9tbV9maXRBXzEyLCBwYXJzID0gYygiYWxwaGFfYmFyIiwgInNpZ21hIiwgImFscGhhIiwgImJldGEiKSkkc3VtbWFyeQpgYGAKCiMjIyMjIFBoYXNlIDEgdG8gUGhhc2UgMwoKVGhlIGRhdGEgbGlzdDoKCmBgYHtyfQpvcmRfbW1fZGF0YUFfMTMgPC0gbGlzdCgKICAgIE4gPSBOUk9XKGRfZmluYWxfMTMpLCAgICAgICAgICAgICAgCiAgICBwaGFzZV9pbmQgPSBkX2ZpbmFsXzEzJHBoYXNlX2luZCwKICAgIEogPSBubGV2ZWxzKGRfZmluYWxfMTMkZmFjdWx0eSksICAKICAgIGZhY3VsdHlfaW5kID0gZF9maW5hbF8xMyRmYWN1bHR5X2luZCwKICAgIEsgPSBubGV2ZWxzKGRfZmluYWxfMTMkZ3JhZGVfY29sbCksIAogICAgeSA9IGRfZmluYWxfMTMkZ3JhZGVfb3JkCikKYGBgCgpGaXQgdGhlIG1vZGVsOgoKYGBge3IsIGNhY2hlID0gVFJVRX0Kb3JkX21tX2ZpdEFfMTMgPC0gc2FtcGxpbmcob3JkX21tX21vZGVsQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG9yZF9tbV9kYXRhQV8xMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlZCA9IDExMTE1KQpgYGAKCkNvZWZmaWNpZW50cyBvZiB0aGUgbW9kZWw6CgpgYGB7cn0Kc3VtbWFyeShvcmRfbW1fZml0QV8xMywgcGFycyA9IGMoImFscGhhX2JhciIsICJzaWdtYSIsICJhbHBoYSIsICJiZXRhIikpJHN1bW1hcnkKYGBgCgojIyMjIE1vZGVsIEIKCmBgYHtzdGFuLCBvdXRwdXQudmFyID0gIm9yZF9tbV9tb2RlbEIiLCBjYWNoZSA9IFRSVUV9CmRhdGEgewogIGludDxsb3dlcj0wPiBOOyAgICAgICAgICAgICAgICAgICAgIC8vIHNhbXBsZSBzaXplCiAgaW50PGxvd2VyPTEsIHVwcGVyPTI+IHBoYXNlX2luZFtOXTsgLy8gdHdvIHBoYXNlcwogIGludDxsb3dlcj0yPiBKOyAgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBmYWN1bHR5CiAgaW50PGxvd2VyPTE+IGZhY3VsdHlfaW5kW05dOyAgICAgICAgLy8gZmFjdWx0eSBhcnJheQogIGludDxsb3dlcj0xPiBnZW5kZXJfaW5kW05dOyAgICAgICAgIC8vIGdlbmRlciBhcnJheQogIGludDxsb3dlcj0xPiBwaGFzZV9nZW5kZXJbTl07ICAgICAgIC8vIHBoYXNlL2dlbmRlciBpbnRlcmFjdGlvbgogIGludDxsb3dlcj0xPiByYWNlX2luZFtOXTsgICAgICAgICAgIC8vIHJhY2UgYXJyYXkKICBpbnQ8bG93ZXI9MT4gcGhhc2VfcmFjZVtOXTsgICAgICAgICAvLyBwaGFzZS9yYWNlIGludGVyYWN0aW9uCiAgaW50PGxvd2VyPTI+IEs7ICAgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGdyYWRlIGNhdGVnb3JpZXMKICBpbnQ8bG93ZXI9MSwgdXBwZXI9Sz4geVtOXTsgICAgICAgICAvLyBncmFkZSBjb2Rlcwp9CnBhcmFtZXRlcnMgewogIHJlYWwgYWxwaGFfYmFyOwogIHJlYWw8bG93ZXI9MD4gc2lnbWE7CiAgcmVhbCBhbHBoYVtKXTsKICByZWFsIGJldGFbMl07CiAgcmVhbCBnYW1tYVsyXTsKICByZWFsIGRlbHRhWzRdOwogIHJlYWwgcmhvWzJdOwogIHJlYWwgemV0YVs0XTsKICBvcmRlcmVkW0sgLSAxXSBjOwp9Cm1vZGVsIHsKICBhbHBoYV9iYXIgfiBub3JtYWwoMCwgMSk7CiAgc2lnbWEgfiBleHBvbmVudGlhbCgxKTsKICBhbHBoYSB+IG5vcm1hbChhbHBoYV9iYXIsIHNpZ21hKTsKICBiZXRhIH4gbm9ybWFsKDAsIDEpOwogIGdhbW1hIH4gbm9ybWFsKDAsIDEpOwogIGRlbHRhIH4gbm9ybWFsKDAsIDEpOwogIHJobyB+IG5vcm1hbCgwLCAxKTsKICB6ZXRhIH4gbm9ybWFsKDAsIDEpOwogIGZvciAobiBpbiAxOk4pIHsKICAgIHJlYWwgZXRhOwogICAgZXRhID0gYWxwaGFbZmFjdWx0eV9pbmRbbl1dICsgYmV0YVtwaGFzZV9pbmRbbl1dICsgCiAgICAgIGdhbW1hW2dlbmRlcl9pbmRbbl1dICsgZGVsdGFbcGhhc2VfZ2VuZGVyW25dXSArCiAgICAgIHJob1tyYWNlX2luZFtuXV0gKyB6ZXRhW3BoYXNlX3JhY2Vbbl1dOwogICAgeVtuXSB+IG9yZGVyZWRfbG9naXN0aWMoZXRhLCBjKTsKICB9Cn0KYGBgCgojIyMjIyBQaGFzZSAxIHRvIFBoYXNlIDIKClRoZSBkYXRhIGxpc3Q6CgpgYGB7cn0Kb3JkX21tX2RhdGFCXzEyIDwtIGxpc3QoCiAgICBOID0gTlJPVyhkX2ZpbmFsXzEyKSwgICAgICAgICAgICAgIAogICAgcGhhc2VfaW5kID0gZF9maW5hbF8xMiRwaGFzZV9pbmQsCiAgICBKID0gbmxldmVscyhkX2ZpbmFsXzEyJGZhY3VsdHkpLCAgCiAgICBmYWN1bHR5X2luZCA9IGRfZmluYWxfMTIkZmFjdWx0eV9pbmQsCiAgICBnZW5kZXJfaW5kID0gZF9maW5hbF8xMiRnZW5kZXJfaW5kLAogICAgcGhhc2VfZ2VuZGVyID0gZF9maW5hbF8xMiRwaGFzZV9nZW5kZXIsCiAgICByYWNlX2luZCA9IGRfZmluYWxfMTIkcmFjZV9pbmQsCiAgICBwaGFzZV9yYWNlID0gZF9maW5hbF8xMiRwaGFzZV9yYWNlLAogICAgSyA9IG5sZXZlbHMoZF9maW5hbF8xMiRncmFkZV9jb2xsKSwgCiAgICB5ID0gZF9maW5hbF8xMiRncmFkZV9vcmQKKQpgYGAKCkZpdCB0aGUgbW9kZWw6CgpgYGB7ciwgY2FjaGUgPSBUUlVFfQpvcmRfbW1fZml0Ql8xMiA8LSBzYW1wbGluZyhvcmRfbW1fbW9kZWxCLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gb3JkX21tX2RhdGFCXzEyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyID0gODAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlZCA9IDExMTE2KQpgYGAKCkNvZWZmaWNpZW50cyBvZiB0aGUgbW9kZWw6CgpgYGB7cn0Kc3VtbWFyeShvcmRfbW1fZml0Ql8xMiwgcGFycyA9IGMoImFscGhhX2JhciIsICJzaWdtYSIsICJhbHBoYSIsICJiZXRhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdhbW1hIiwgImRlbHRhIiwgInJobyIsICJ6ZXRhIikpJHN1bW1hcnkKYGBgCgojIyMjIFBoYXNlIDEgdG8gUGhhc2UgMwoKVGhlIGRhdGEgbGlzdDoKCmBgYHtyfQpvcmRfbW1fZGF0YUJfMTMgPC0gbGlzdCgKICAgIE4gPSBOUk9XKGRfZmluYWxfMTMpLCAgICAgICAgICAgICAgCiAgICBwaGFzZV9pbmQgPSBkX2ZpbmFsXzEzJHBoYXNlX2luZCwKICAgIEogPSBubGV2ZWxzKGRfZmluYWxfMTMkZmFjdWx0eSksICAKICAgIGZhY3VsdHlfaW5kID0gZF9maW5hbF8xMyRmYWN1bHR5X2luZCwKICAgIGdlbmRlcl9pbmQgPSBkX2ZpbmFsXzEzJGdlbmRlcl9pbmQsCiAgICBwaGFzZV9nZW5kZXIgPSBkX2ZpbmFsXzEzJHBoYXNlX2dlbmRlciwKICAgIHJhY2VfaW5kID0gZF9maW5hbF8xMyRyYWNlX2luZCwKICAgIHBoYXNlX3JhY2UgPSBkX2ZpbmFsXzEzJHBoYXNlX3JhY2UsCiAgICBLID0gbmxldmVscyhkX2ZpbmFsXzEzJGdyYWRlX2NvbGwpLCAKICAgIHkgPSBkX2ZpbmFsXzEzJGdyYWRlX29yZAopCmBgYAoKRml0IHRoZSBtb2RlbDoKCmBgYHtyLCBjYWNoZSA9IFRSVUV9Cm9yZF9tbV9maXRCXzEzIDwtIHNhbXBsaW5nKG9yZF9tbV9tb2RlbEIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBvcmRfbW1fZGF0YUJfMTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZWQgPSAxMTExNykKYGBgCgpDb2VmZmljaWVudHMgb2YgdGhlIG1vZGVsOgoKYGBge3J9CnN1bW1hcnkob3JkX21tX2ZpdEJfMTMsIHBhcnMgPSBjKCJhbHBoYV9iYXIiLCAic2lnbWEiLCAiYWxwaGEiLCAiYmV0YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnYW1tYSIsICJkZWx0YSIsICJyaG8iLCAiemV0YSIpKSRzdW1tYXJ5CmBgYAoKCiMjIFJlc3VsdHMKCiMjIyBPZGRzIHJhdGlvcwoKIyMjIyBNb2RlbCBBCgojIyMjIyBQaGFzZSAxIHRvIFBoYXNlIDIKCmBgYHtyfQpvcmRfbW1fdGlkeUFfMTIgPC0gb3JkX21tX2ZpdEFfMTIgJT4lCiAgICBzcHJlYWRfZHJhd3MoYWxwaGFbLi5dLCBiZXRhWy4uXSwgY1suLl0pICU+JQogICAgbXV0YXRlKG9yID0gZXhwKGJldGEuMSAtIGJldGEuMikpCmBgYAoKYGBge3J9CmdncGxvdChvcmRfbW1fdGlkeUFfMTIsIGFlcyh4ID0gb3IpKSArCiAgICBnZW9tX2hpc3RvZ3JhbSgpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEsIGNvbG9yID0gImJsdWUiKQpgYGAKCmBgYHtyfQp0YWJsZShvcmRfbW1fdGlkeUFfMTIkb3IgPj0gMSkvTlJPVyhvcmRfbW1fdGlkeUFfMTIpCmBgYAoKIyMjIyMgUGhhc2UgMSB0byBQaGFzZSAzCgpgYGB7cn0Kb3JkX21tX3RpZHlBXzEzIDwtIG9yZF9tbV9maXRBXzEzICU+JQogICAgc3ByZWFkX2RyYXdzKGFscGhhWy4uXSwgYmV0YVsuLl0sIGNbLi5dKSAlPiUKICAgIG11dGF0ZShvciA9IGV4cChiZXRhLjEgLSBiZXRhLjIpKQpgYGAKCmBgYHtyfQpnZ3Bsb3Qob3JkX21tX3RpZHlBXzEzLCBhZXMoeCA9IG9yKSkgKwogICAgZ2VvbV9oaXN0b2dyYW0oKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxLCBjb2xvciA9ICJibHVlIikKYGBgCgpgYGB7cn0KdGFibGUob3JkX21tX3RpZHlBXzEzJG9yID49IDEpL05ST1cob3JkX21tX3RpZHlBXzEzKQpgYGAKCiMjIyMgTW9kZWwgQgoKIyMjIyMgUGhhc2UgMSB0byBQaGFzZSAyCgpgYGB7cn0Kb3JkX21tX3RpZHlCXzEyIDwtIG9yZF9tbV9maXRCXzEyICU+JQogICAgc3ByZWFkX2RyYXdzKGFscGhhWy4uXSwgYmV0YVsuLl0sIGdhbW1hWy4uXSwgY1suLl0sCiAgICAgICAgICAgICAgICAgZGVsdGFbLi5dLCByaG9bLi5dLCB6ZXRhWy4uXSkgJT4lCiAgICBtdXRhdGUob3JfbWVuX1dBID0gZXhwKGJldGEuMSAtIGJldGEuMiArIGRlbHRhLjEgLSBkZWx0YS4zICsgemV0YS4xIC0gemV0YS4zKSwKICAgICAgICAgICBvcl93b21lbl9XQSA9IGV4cChiZXRhLjEgLSBiZXRhLjIgKyBkZWx0YS4yIC0gZGVsdGEuNCArIHpldGEuMSAtIHpldGEuMyksCiAgICAgICAgICAgb3JfbWVuX0JISSA9IGV4cChiZXRhLjEgLSBiZXRhLjIgKyBkZWx0YS4xIC0gZGVsdGEuMyArIHpldGEuMiAtIHpldGEuNCksCiAgICAgICAgICAgb3Jfd29tZW5fQkhJID0gZXhwKGJldGEuMSAtIGJldGEuMiArIGRlbHRhLjIgLSBkZWx0YS40ICsgemV0YS4yIC0gemV0YS40KSkKYGBgCgpgYGB7cn0KZ2dwbG90KG9yZF9tbV90aWR5Ql8xMiwgYWVzKHggPSBvcl9tZW5fQkhJKSkgKwogICAgZ2VvbV9oaXN0b2dyYW0oKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxLCBjb2xvciA9ICJibHVlIikKYGBgCgpgYGB7cn0KdGFibGUob3JkX21tX3RpZHlCXzEyJG9yX21lbl9CSEkgPj0gMSkvTlJPVyhvcmRfbW1fdGlkeUJfMTIpCmBgYAoKYGBge3J9CmdncGxvdChvcmRfbW1fdGlkeUJfMTIsIGFlcyh4ID0gb3Jfd29tZW5fQkhJKSkgKwogICAgZ2VvbV9oaXN0b2dyYW0oKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxLCBjb2xvciA9ICJibHVlIikKYGBgCgpgYGB7cn0KdGFibGUob3JkX21tX3RpZHlCXzEyJG9yX3dvbWVuX0JISSA+PSAxKS9OUk9XKG9yZF9tbV90aWR5Ql8xMikKYGBgCgpgYGB7cn0KZ2dwbG90KG9yZF9tbV90aWR5Ql8xMiwgYWVzKHggPSBvcl9tZW5fV0EpKSArCiAgICBnZW9tX2hpc3RvZ3JhbSgpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEsIGNvbG9yID0gImJsdWUiKQpgYGAKCmBgYHtyfQp0YWJsZShvcmRfbW1fdGlkeUJfMTIkb3JfbWVuX1dBID49IDEpL05ST1cob3JkX21tX3RpZHlCXzEyKQpgYGAKCmBgYHtyfQpnZ3Bsb3Qob3JkX21tX3RpZHlCXzEyLCBhZXMoeCA9IG9yX3dvbWVuX1dBKSkgKwogICAgZ2VvbV9oaXN0b2dyYW0oKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxLCBjb2xvciA9ICJibHVlIikKYGBgCgpgYGB7cn0KdGFibGUob3JkX21tX3RpZHlCXzEyJG9yX3dvbWVuX1dBID49IDEpL05ST1cob3JkX21tX3RpZHlCXzEyKQpgYGAKCiMjIyMjIFBoYXNlIDEgdG8gUGhhc2UgMwoKYGBge3J9Cm9yZF9tbV90aWR5Ql8xMyA8LSBvcmRfbW1fZml0Ql8xMyAlPiUKICAgIHNwcmVhZF9kcmF3cyhhbHBoYVsuLl0sIGJldGFbLi5dLCBnYW1tYVsuLl0sIGNbLi5dLAogICAgICAgICAgICAgICAgIGRlbHRhWy4uXSwgcmhvWy4uXSwgemV0YVsuLl0pICU+JQogICAgbXV0YXRlKG9yX21lbl9XQSA9IGV4cChiZXRhLjEgLSBiZXRhLjIgKyBkZWx0YS4xIC0gZGVsdGEuMyArIHpldGEuMSAtIHpldGEuMyksCiAgICAgICAgICAgb3Jfd29tZW5fV0EgPSBleHAoYmV0YS4xIC0gYmV0YS4yICsgZGVsdGEuMiAtIGRlbHRhLjQgKyB6ZXRhLjEgLSB6ZXRhLjMpLAogICAgICAgICAgIG9yX21lbl9CSEkgPSBleHAoYmV0YS4xIC0gYmV0YS4yICsgZGVsdGEuMSAtIGRlbHRhLjMgKyB6ZXRhLjIgLSB6ZXRhLjQpLAogICAgICAgICAgIG9yX3dvbWVuX0JISSA9IGV4cChiZXRhLjEgLSBiZXRhLjIgKyBkZWx0YS4yIC0gZGVsdGEuNCArIHpldGEuMiAtIHpldGEuNCkpCmBgYAoKYGBge3J9CmdncGxvdChvcmRfbW1fdGlkeUJfMTMsIGFlcyh4ID0gb3JfbWVuX0JISSkpICsKICAgIGdlb21faGlzdG9ncmFtKCkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMSwgY29sb3IgPSAiYmx1ZSIpCmBgYAoKYGBge3J9CnRhYmxlKG9yZF9tbV90aWR5Ql8xMyRvcl9tZW5fQkhJID49IDEpL05ST1cob3JkX21tX3RpZHlCXzEzKQpgYGAKCmBgYHtyfQpnZ3Bsb3Qob3JkX21tX3RpZHlCXzEzLCBhZXMoeCA9IG9yX3dvbWVuX0JISSkpICsKICAgIGdlb21faGlzdG9ncmFtKCkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMSwgY29sb3IgPSAiYmx1ZSIpCmBgYAoKYGBge3J9CnRhYmxlKG9yZF9tbV90aWR5Ql8xMyRvcl93b21lbl9CSEkgPj0gMSkvTlJPVyhvcmRfbW1fdGlkeUJfMTMpCmBgYAoKYGBge3J9CmdncGxvdChvcmRfbW1fdGlkeUJfMTMsIGFlcyh4ID0gb3JfbWVuX1dBKSkgKwogICAgZ2VvbV9oaXN0b2dyYW0oKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxLCBjb2xvciA9ICJibHVlIikKYGBgCgpgYGB7cn0KdGFibGUob3JkX21tX3RpZHlCXzEzJG9yX21lbl9XQSA+PSAxKS9OUk9XKG9yZF9tbV90aWR5Ql8xMykKYGBgCgpgYGB7cn0KZ2dwbG90KG9yZF9tbV90aWR5Ql8xMywgYWVzKHggPSBvcl93b21lbl9XQSkpICsKICAgIGdlb21faGlzdG9ncmFtKCkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMSwgY29sb3IgPSAiYmx1ZSIpCmBgYAoKYGBge3J9CnRhYmxlKG9yZF9tbV90aWR5Ql8xMyRvcl93b21lbl9XQSA+PSAxKS9OUk9XKG9yZF9tbV90aWR5Ql8xMykKYGBgCgojIyBGYWN1bHR5IGRpZmZlcmVuY2VzIGZvciBNb2RlbCBBCgojIyMgUGhhc2UgMSB0byBQaGFzZSAyCgpgYGB7cn0Kb3JkX21tX3RpZHlBXzEyIDwtIG9yZF9tbV9maXRBXzEyICU+JQogICAgc3ByZWFkX2RyYXdzKGFscGhhWy4uXSwgYmV0YVsuLl0sIGNbLi5dKSAlPiUKICAgIG11dGF0ZShvciA9IGV4cChiZXRhLjEgLSBiZXRhLjIpLAogICAgICAgICAgIEExXzEgPSAxIC0gcGxvZ2lzKGFscGhhLjEgKyBiZXRhLjEgLSBjLjEpLAogICAgICAgICAgIEEyXzEgPSAxIC0gcGxvZ2lzKGFscGhhLjIgKyBiZXRhLjEgLSBjLjEpLAogICAgICAgICAgIEEzXzEgPSAxIC0gcGxvZ2lzKGFscGhhLjMgKyBiZXRhLjEgLSBjLjEpLAogICAgICAgICAgIEE0XzEgPSAxIC0gcGxvZ2lzKGFscGhhLjQgKyBiZXRhLjEgLSBjLjEpLAogICAgICAgICAgIEE1XzEgPSAxIC0gcGxvZ2lzKGFscGhhLjUgKyBiZXRhLjEgLSBjLjEpLAogICAgICAgICAgIEE2XzEgPSAxIC0gcGxvZ2lzKGFscGhhLjYgKyBiZXRhLjEgLSBjLjEpLAogICAgICAgICAgIEE3XzEgPSAxIC0gcGxvZ2lzKGFscGhhLjcgKyBiZXRhLjEgLSBjLjEpLAogICAgICAgICAgIEE4XzEgPSAxIC0gcGxvZ2lzKGFscGhhLjggKyBiZXRhLjEgLSBjLjEpLAogICAgICAgICAgIEE5XzEgPSAxIC0gcGxvZ2lzKGFscGhhLjkgKyBiZXRhLjEgLSBjLjEpLAogICAgICAgICAgIEExMF8xID0gMSAtIHBsb2dpcyhhbHBoYS4xMCArIGJldGEuMSAtIGMuMSksCiAgICAgICAgICAgQTExXzEgPSAxIC0gcGxvZ2lzKGFscGhhLjExICsgYmV0YS4xIC0gYy4xKSwKICAgICAgICAgICBBMTJfMSA9IDEgLSBwbG9naXMoYWxwaGEuMTIgKyBiZXRhLjEgLSBjLjEpLAogICAgICAgICAgIEExM18xID0gMSAtIHBsb2dpcyhhbHBoYS4xMyArIGJldGEuMSAtIGMuMSksCiAgICAgICAgICAgQTE0XzEgPSAxIC0gcGxvZ2lzKGFscGhhLjE0ICsgYmV0YS4xIC0gYy4xKSwKICAgICAgICAgICBBMTVfMSA9IDEgLSBwbG9naXMoYWxwaGEuMTUgKyBiZXRhLjEgLSBjLjEpLAogICAgICAgICAgIEExNl8xID0gMSAtIHBsb2dpcyhhbHBoYS4xNiArIGJldGEuMSAtIGMuMSksCiAgICAgICAgICAgQTE3XzEgPSAxIC0gcGxvZ2lzKGFscGhhLjE3ICsgYmV0YS4xIC0gYy4xKSwKICAgICAgICAgICBBMThfMSA9IDEgLSBwbG9naXMoYWxwaGEuMTggKyBiZXRhLjEgLSBjLjEpLAogICAgICAgICAgIEExOV8xID0gMSAtIHBsb2dpcyhhbHBoYS4xOSArIGJldGEuMSAtIGMuMSksCiAgICAgICAgICAgQTIwXzEgPSAxIC0gcGxvZ2lzKGFscGhhLjIwICsgYmV0YS4xIC0gYy4xKSwKICAgICAgICAgICBBMjFfMSA9IDEgLSBwbG9naXMoYWxwaGEuMjEgKyBiZXRhLjEgLSBjLjEpLAogICAgICAgICAgIEEyMl8xID0gMSAtIHBsb2dpcyhhbHBoYS4yMiArIGJldGEuMSAtIGMuMSksCiAgICAgICAgICAgQTIzXzEgPSAxIC0gcGxvZ2lzKGFscGhhLjIzICsgYmV0YS4xIC0gYy4xKSwKICAgICAgICAgICBBMjRfMSA9IDEgLSBwbG9naXMoYWxwaGEuMjQgKyBiZXRhLjEgLSBjLjEpLAogICAgICAgICAgIEEyNV8xID0gMSAtIHBsb2dpcyhhbHBoYS4yNSArIGJldGEuMSAtIGMuMSksCiAgICAgICAgICAgQTFfMiA9IDEgLSBwbG9naXMoYWxwaGEuMSArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQTJfMiA9IDEgLSBwbG9naXMoYWxwaGEuMiArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQTNfMiA9IDEgLSBwbG9naXMoYWxwaGEuMyArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQTRfMiA9IDEgLSBwbG9naXMoYWxwaGEuNCArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQTVfMiA9IDEgLSBwbG9naXMoYWxwaGEuNSArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQTZfMiA9IDEgLSBwbG9naXMoYWxwaGEuNiArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQTdfMiA9IDEgLSBwbG9naXMoYWxwaGEuNyArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQThfMiA9IDEgLSBwbG9naXMoYWxwaGEuOCArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQTlfMiA9IDEgLSBwbG9naXMoYWxwaGEuOSArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQTEwXzIgPSAxIC0gcGxvZ2lzKGFscGhhLjEwICsgYmV0YS4yIC0gYy4xKSwKICAgICAgICAgICBBMTFfMiA9IDEgLSBwbG9naXMoYWxwaGEuMTEgKyBiZXRhLjIgLSBjLjEpLAogICAgICAgICAgIEExMl8yID0gMSAtIHBsb2dpcyhhbHBoYS4xMiArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQTEzXzIgPSAxIC0gcGxvZ2lzKGFscGhhLjEzICsgYmV0YS4yIC0gYy4xKSwKICAgICAgICAgICBBMTRfMiA9IDEgLSBwbG9naXMoYWxwaGEuMTQgKyBiZXRhLjIgLSBjLjEpLAogICAgICAgICAgIEExNV8yID0gMSAtIHBsb2dpcyhhbHBoYS4xNSArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQTE2XzIgPSAxIC0gcGxvZ2lzKGFscGhhLjE2ICsgYmV0YS4yIC0gYy4xKSwKICAgICAgICAgICBBMTdfMiA9IDEgLSBwbG9naXMoYWxwaGEuMTcgKyBiZXRhLjIgLSBjLjEpLAogICAgICAgICAgIEExOF8yID0gMSAtIHBsb2dpcyhhbHBoYS4xOCArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQTE5XzIgPSAxIC0gcGxvZ2lzKGFscGhhLjE5ICsgYmV0YS4yIC0gYy4xKSwKICAgICAgICAgICBBMjBfMiA9IDEgLSBwbG9naXMoYWxwaGEuMjAgKyBiZXRhLjIgLSBjLjEpLAogICAgICAgICAgIEEyMV8yID0gMSAtIHBsb2dpcyhhbHBoYS4yMSArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQTIyXzIgPSAxIC0gcGxvZ2lzKGFscGhhLjIyICsgYmV0YS4yIC0gYy4xKSwKICAgICAgICAgICBBMjNfMiA9IDEgLSBwbG9naXMoYWxwaGEuMjMgKyBiZXRhLjIgLSBjLjEpLAogICAgICAgICAgIEEyNF8yID0gMSAtIHBsb2dpcyhhbHBoYS4yNCArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQTI1XzIgPSAxIC0gcGxvZ2lzKGFscGhhLjI1ICsgYmV0YS4yIC0gYy4xKSwKICAgICAgICAgICBCMV8xID0gcGxvZ2lzKGFscGhhLjEgKyBiZXRhLjEgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjEgKyBiZXRhLjEgLSBjLjIpLAogICAgICAgICAgIEIyXzEgPSBwbG9naXMoYWxwaGEuMiArIGJldGEuMSAtIGMuMSkgLSBwbG9naXMoYWxwaGEuMiArIGJldGEuMSAtIGMuMiksCiAgICAgICAgICAgQjNfMSA9IHBsb2dpcyhhbHBoYS4zICsgYmV0YS4xIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS4zICsgYmV0YS4xIC0gYy4yKSwKICAgICAgICAgICBCNF8xID0gcGxvZ2lzKGFscGhhLjQgKyBiZXRhLjEgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjQgKyBiZXRhLjEgLSBjLjIpLAogICAgICAgICAgIEI1XzEgPSBwbG9naXMoYWxwaGEuNSArIGJldGEuMSAtIGMuMSkgLSBwbG9naXMoYWxwaGEuNSArIGJldGEuMSAtIGMuMiksCiAgICAgICAgICAgQjZfMSA9IHBsb2dpcyhhbHBoYS42ICsgYmV0YS4xIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS42ICsgYmV0YS4xIC0gYy4yKSwKICAgICAgICAgICBCN18xID0gcGxvZ2lzKGFscGhhLjcgKyBiZXRhLjEgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjcgKyBiZXRhLjEgLSBjLjIpLAogICAgICAgICAgIEI4XzEgPSBwbG9naXMoYWxwaGEuOCArIGJldGEuMSAtIGMuMSkgLSBwbG9naXMoYWxwaGEuOCArIGJldGEuMSAtIGMuMiksCiAgICAgICAgICAgQjlfMSA9IHBsb2dpcyhhbHBoYS45ICsgYmV0YS4xIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS45ICsgYmV0YS4xIC0gYy4yKSwKICAgICAgICAgICBCMTBfMSA9IHBsb2dpcyhhbHBoYS4xMCArIGJldGEuMSAtIGMuMSkgLSBwbG9naXMoYWxwaGEuMTAgKyBiZXRhLjEgLSBjLjIpLAogICAgICAgICAgIEIxMV8xID0gcGxvZ2lzKGFscGhhLjExICsgYmV0YS4xIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS4xMSArIGJldGEuMSAtIGMuMiksCiAgICAgICAgICAgQjEyXzEgPSBwbG9naXMoYWxwaGEuMTIgKyBiZXRhLjEgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjEyICsgYmV0YS4xIC0gYy4yKSwKICAgICAgICAgICBCMTNfMSA9IHBsb2dpcyhhbHBoYS4xMyArIGJldGEuMSAtIGMuMSkgLSBwbG9naXMoYWxwaGEuMTMgKyBiZXRhLjEgLSBjLjIpLAogICAgICAgICAgIEIxNF8xID0gcGxvZ2lzKGFscGhhLjE0ICsgYmV0YS4xIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS4xNCArIGJldGEuMSAtIGMuMiksCiAgICAgICAgICAgQjE1XzEgPSBwbG9naXMoYWxwaGEuMTUgKyBiZXRhLjEgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjE1ICsgYmV0YS4xIC0gYy4yKSwKICAgICAgICAgICBCMTZfMSA9IHBsb2dpcyhhbHBoYS4xNiArIGJldGEuMSAtIGMuMSkgLSBwbG9naXMoYWxwaGEuMTYgKyBiZXRhLjEgLSBjLjIpLAogICAgICAgICAgIEIxN18xID0gcGxvZ2lzKGFscGhhLjE3ICsgYmV0YS4xIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS4xNyArIGJldGEuMSAtIGMuMiksCiAgICAgICAgICAgQjE4XzEgPSBwbG9naXMoYWxwaGEuMTggKyBiZXRhLjEgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjE4ICsgYmV0YS4xIC0gYy4yKSwKICAgICAgICAgICBCMTlfMSA9IHBsb2dpcyhhbHBoYS4xOSArIGJldGEuMSAtIGMuMSkgLSBwbG9naXMoYWxwaGEuMTkgKyBiZXRhLjEgLSBjLjIpLAogICAgICAgICAgIEIyMF8xID0gcGxvZ2lzKGFscGhhLjIwICsgYmV0YS4xIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS4yMCArIGJldGEuMSAtIGMuMiksCiAgICAgICAgICAgQjIxXzEgPSBwbG9naXMoYWxwaGEuMjEgKyBiZXRhLjEgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjIxICsgYmV0YS4xIC0gYy4yKSwKICAgICAgICAgICBCMjJfMSA9IHBsb2dpcyhhbHBoYS4yMiArIGJldGEuMSAtIGMuMSkgLSBwbG9naXMoYWxwaGEuMjIgKyBiZXRhLjEgLSBjLjIpLAogICAgICAgICAgIEIyM18xID0gcGxvZ2lzKGFscGhhLjIzICsgYmV0YS4xIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS4yMyArIGJldGEuMSAtIGMuMiksCiAgICAgICAgICAgQjI0XzEgPSBwbG9naXMoYWxwaGEuMjQgKyBiZXRhLjEgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjI0ICsgYmV0YS4xIC0gYy4yKSwKICAgICAgICAgICBCMjVfMSA9IHBsb2dpcyhhbHBoYS4yNSArIGJldGEuMSAtIGMuMSkgLSBwbG9naXMoYWxwaGEuMjUgKyBiZXRhLjEgLSBjLjIpLAogICAgICAgICAgIEIxXzIgPSBwbG9naXMoYWxwaGEuMSArIGJldGEuMiAtIGMuMSkgLSBwbG9naXMoYWxwaGEuMSArIGJldGEuMiAtIGMuMiksCiAgICAgICAgICAgQjJfMiA9IHBsb2dpcyhhbHBoYS4yICsgYmV0YS4yIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS4yICsgYmV0YS4yIC0gYy4yKSwKICAgICAgICAgICBCM18yID0gcGxvZ2lzKGFscGhhLjMgKyBiZXRhLjIgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjMgKyBiZXRhLjIgLSBjLjIpLAogICAgICAgICAgIEI0XzIgPSBwbG9naXMoYWxwaGEuNCArIGJldGEuMiAtIGMuMSkgLSBwbG9naXMoYWxwaGEuNCArIGJldGEuMiAtIGMuMiksCiAgICAgICAgICAgQjVfMiA9IHBsb2dpcyhhbHBoYS41ICsgYmV0YS4yIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS41ICsgYmV0YS4yIC0gYy4yKSwKICAgICAgICAgICBCNl8yID0gcGxvZ2lzKGFscGhhLjYgKyBiZXRhLjIgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjYgKyBiZXRhLjIgLSBjLjIpLAogICAgICAgICAgIEI3XzIgPSBwbG9naXMoYWxwaGEuNyArIGJldGEuMiAtIGMuMSkgLSBwbG9naXMoYWxwaGEuNyArIGJldGEuMiAtIGMuMiksCiAgICAgICAgICAgQjhfMiA9IHBsb2dpcyhhbHBoYS44ICsgYmV0YS4yIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS44ICsgYmV0YS4yIC0gYy4yKSwKICAgICAgICAgICBCOV8yID0gcGxvZ2lzKGFscGhhLjkgKyBiZXRhLjIgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjkgKyBiZXRhLjIgLSBjLjIpLAogICAgICAgICAgIEIxMF8yID0gcGxvZ2lzKGFscGhhLjEwICsgYmV0YS4yIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS4xMCArIGJldGEuMiAtIGMuMiksCiAgICAgICAgICAgQjExXzIgPSBwbG9naXMoYWxwaGEuMTEgKyBiZXRhLjIgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjExICsgYmV0YS4yIC0gYy4yKSwKICAgICAgICAgICBCMTJfMiA9IHBsb2dpcyhhbHBoYS4xMiArIGJldGEuMiAtIGMuMSkgLSBwbG9naXMoYWxwaGEuMTIgKyBiZXRhLjIgLSBjLjIpLAogICAgICAgICAgIEIxM18yID0gcGxvZ2lzKGFscGhhLjEzICsgYmV0YS4yIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS4xMyArIGJldGEuMiAtIGMuMiksCiAgICAgICAgICAgQjE0XzIgPSBwbG9naXMoYWxwaGEuMTQgKyBiZXRhLjIgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjE0ICsgYmV0YS4yIC0gYy4yKSwKICAgICAgICAgICBCMTVfMiA9IHBsb2dpcyhhbHBoYS4xNSArIGJldGEuMiAtIGMuMSkgLSBwbG9naXMoYWxwaGEuMTUgKyBiZXRhLjIgLSBjLjIpLAogICAgICAgICAgIEIxNl8yID0gcGxvZ2lzKGFscGhhLjE2ICsgYmV0YS4yIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS4xNiArIGJldGEuMiAtIGMuMiksCiAgICAgICAgICAgQjE3XzIgPSBwbG9naXMoYWxwaGEuMTcgKyBiZXRhLjIgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjE3ICsgYmV0YS4yIC0gYy4yKSwKICAgICAgICAgICBCMThfMiA9IHBsb2dpcyhhbHBoYS4xOCArIGJldGEuMiAtIGMuMSkgLSBwbG9naXMoYWxwaGEuMTggKyBiZXRhLjIgLSBjLjIpLAogICAgICAgICAgIEIxOV8yID0gcGxvZ2lzKGFscGhhLjE5ICsgYmV0YS4yIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS4xOSArIGJldGEuMiAtIGMuMiksCiAgICAgICAgICAgQjIwXzIgPSBwbG9naXMoYWxwaGEuMjAgKyBiZXRhLjIgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjIwICsgYmV0YS4yIC0gYy4yKSwKICAgICAgICAgICBCMjFfMiA9IHBsb2dpcyhhbHBoYS4yMSArIGJldGEuMiAtIGMuMSkgLSBwbG9naXMoYWxwaGEuMjEgKyBiZXRhLjIgLSBjLjIpLAogICAgICAgICAgIEIyMl8yID0gcGxvZ2lzKGFscGhhLjIyICsgYmV0YS4yIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS4yMiArIGJldGEuMiAtIGMuMiksCiAgICAgICAgICAgQjIzXzIgPSBwbG9naXMoYWxwaGEuMjMgKyBiZXRhLjIgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjIzICsgYmV0YS4yIC0gYy4yKSwKICAgICAgICAgICBCMjRfMiA9IHBsb2dpcyhhbHBoYS4yNCArIGJldGEuMiAtIGMuMSkgLSBwbG9naXMoYWxwaGEuMjQgKyBiZXRhLjIgLSBjLjIpLAogICAgICAgICAgIEIyNV8yID0gcGxvZ2lzKGFscGhhLjI1ICsgYmV0YS4yIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS4yNSArIGJldGEuMiAtIGMuMiksCiAgICAgICAgICAgQzFfMSA9IHBsb2dpcyhhbHBoYS4xICsgYmV0YS4xIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS4xICsgYmV0YS4xIC0gYy4zKSwKICAgICAgICAgICBDMl8xID0gcGxvZ2lzKGFscGhhLjIgKyBiZXRhLjEgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjIgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIEMzXzEgPSBwbG9naXMoYWxwaGEuMyArIGJldGEuMSAtIGMuMikgLSBwbG9naXMoYWxwaGEuMyArIGJldGEuMSAtIGMuMyksCiAgICAgICAgICAgQzRfMSA9IHBsb2dpcyhhbHBoYS40ICsgYmV0YS4xIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS40ICsgYmV0YS4xIC0gYy4zKSwKICAgICAgICAgICBDNV8xID0gcGxvZ2lzKGFscGhhLjUgKyBiZXRhLjEgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjUgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIEM2XzEgPSBwbG9naXMoYWxwaGEuNiArIGJldGEuMSAtIGMuMikgLSBwbG9naXMoYWxwaGEuNiArIGJldGEuMSAtIGMuMyksCiAgICAgICAgICAgQzdfMSA9IHBsb2dpcyhhbHBoYS43ICsgYmV0YS4xIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS43ICsgYmV0YS4xIC0gYy4zKSwKICAgICAgICAgICBDOF8xID0gcGxvZ2lzKGFscGhhLjggKyBiZXRhLjEgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjggKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIEM5XzEgPSBwbG9naXMoYWxwaGEuOSArIGJldGEuMSAtIGMuMikgLSBwbG9naXMoYWxwaGEuOSArIGJldGEuMSAtIGMuMyksCiAgICAgICAgICAgQzEwXzEgPSBwbG9naXMoYWxwaGEuMTAgKyBiZXRhLjEgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjEwICsgYmV0YS4xIC0gYy4zKSwKICAgICAgICAgICBDMTFfMSA9IHBsb2dpcyhhbHBoYS4xMSArIGJldGEuMSAtIGMuMikgLSBwbG9naXMoYWxwaGEuMTEgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIEMxMl8xID0gcGxvZ2lzKGFscGhhLjEyICsgYmV0YS4xIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS4xMiArIGJldGEuMSAtIGMuMyksCiAgICAgICAgICAgQzEzXzEgPSBwbG9naXMoYWxwaGEuMTMgKyBiZXRhLjEgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjEzICsgYmV0YS4xIC0gYy4zKSwKICAgICAgICAgICBDMTRfMSA9IHBsb2dpcyhhbHBoYS4xNCArIGJldGEuMSAtIGMuMikgLSBwbG9naXMoYWxwaGEuMTQgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIEMxNV8xID0gcGxvZ2lzKGFscGhhLjE1ICsgYmV0YS4xIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS4xNSArIGJldGEuMSAtIGMuMyksCiAgICAgICAgICAgQzE2XzEgPSBwbG9naXMoYWxwaGEuMTYgKyBiZXRhLjEgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjE2ICsgYmV0YS4xIC0gYy4zKSwKICAgICAgICAgICBDMTdfMSA9IHBsb2dpcyhhbHBoYS4xNyArIGJldGEuMSAtIGMuMikgLSBwbG9naXMoYWxwaGEuMTcgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIEMxOF8xID0gcGxvZ2lzKGFscGhhLjE4ICsgYmV0YS4xIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS4xOCArIGJldGEuMSAtIGMuMyksCiAgICAgICAgICAgQzE5XzEgPSBwbG9naXMoYWxwaGEuMTkgKyBiZXRhLjEgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjE5ICsgYmV0YS4xIC0gYy4zKSwKICAgICAgICAgICBDMjBfMSA9IHBsb2dpcyhhbHBoYS4yMCArIGJldGEuMSAtIGMuMikgLSBwbG9naXMoYWxwaGEuMjAgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIEMyMV8xID0gcGxvZ2lzKGFscGhhLjIxICsgYmV0YS4xIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS4yMSArIGJldGEuMSAtIGMuMyksCiAgICAgICAgICAgQzIyXzEgPSBwbG9naXMoYWxwaGEuMjIgKyBiZXRhLjEgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjIyICsgYmV0YS4xIC0gYy4zKSwKICAgICAgICAgICBDMjNfMSA9IHBsb2dpcyhhbHBoYS4yMyArIGJldGEuMSAtIGMuMikgLSBwbG9naXMoYWxwaGEuMjMgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIEMyNF8xID0gcGxvZ2lzKGFscGhhLjI0ICsgYmV0YS4xIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS4yNCArIGJldGEuMSAtIGMuMyksCiAgICAgICAgICAgQzI1XzEgPSBwbG9naXMoYWxwaGEuMjUgKyBiZXRhLjEgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjI1ICsgYmV0YS4xIC0gYy4zKSwKICAgICAgICAgICBDMV8yID0gcGxvZ2lzKGFscGhhLjEgKyBiZXRhLjIgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjEgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIEMyXzIgPSBwbG9naXMoYWxwaGEuMiArIGJldGEuMiAtIGMuMikgLSBwbG9naXMoYWxwaGEuMiArIGJldGEuMiAtIGMuMyksCiAgICAgICAgICAgQzNfMiA9IHBsb2dpcyhhbHBoYS4zICsgYmV0YS4yIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS4zICsgYmV0YS4yIC0gYy4zKSwKICAgICAgICAgICBDNF8yID0gcGxvZ2lzKGFscGhhLjQgKyBiZXRhLjIgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjQgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIEM1XzIgPSBwbG9naXMoYWxwaGEuNSArIGJldGEuMiAtIGMuMikgLSBwbG9naXMoYWxwaGEuNSArIGJldGEuMiAtIGMuMyksCiAgICAgICAgICAgQzZfMiA9IHBsb2dpcyhhbHBoYS42ICsgYmV0YS4yIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS42ICsgYmV0YS4yIC0gYy4zKSwKICAgICAgICAgICBDN18yID0gcGxvZ2lzKGFscGhhLjcgKyBiZXRhLjIgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjcgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIEM4XzIgPSBwbG9naXMoYWxwaGEuOCArIGJldGEuMiAtIGMuMikgLSBwbG9naXMoYWxwaGEuOCArIGJldGEuMiAtIGMuMyksCiAgICAgICAgICAgQzlfMiA9IHBsb2dpcyhhbHBoYS45ICsgYmV0YS4yIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS45ICsgYmV0YS4yIC0gYy4zKSwKICAgICAgICAgICBDMTBfMiA9IHBsb2dpcyhhbHBoYS4xMCArIGJldGEuMiAtIGMuMikgLSBwbG9naXMoYWxwaGEuMTAgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIEMxMV8yID0gcGxvZ2lzKGFscGhhLjExICsgYmV0YS4yIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS4xMSArIGJldGEuMiAtIGMuMyksCiAgICAgICAgICAgQzEyXzIgPSBwbG9naXMoYWxwaGEuMTIgKyBiZXRhLjIgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjEyICsgYmV0YS4yIC0gYy4zKSwKICAgICAgICAgICBDMTNfMiA9IHBsb2dpcyhhbHBoYS4xMyArIGJldGEuMiAtIGMuMikgLSBwbG9naXMoYWxwaGEuMTMgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIEMxNF8yID0gcGxvZ2lzKGFscGhhLjE0ICsgYmV0YS4yIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS4xNCArIGJldGEuMiAtIGMuMyksCiAgICAgICAgICAgQzE1XzIgPSBwbG9naXMoYWxwaGEuMTUgKyBiZXRhLjIgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjE1ICsgYmV0YS4yIC0gYy4zKSwKICAgICAgICAgICBDMTZfMiA9IHBsb2dpcyhhbHBoYS4xNiArIGJldGEuMiAtIGMuMikgLSBwbG9naXMoYWxwaGEuMTYgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIEMxN18yID0gcGxvZ2lzKGFscGhhLjE3ICsgYmV0YS4yIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS4xNyArIGJldGEuMiAtIGMuMyksCiAgICAgICAgICAgQzE4XzIgPSBwbG9naXMoYWxwaGEuMTggKyBiZXRhLjIgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjE4ICsgYmV0YS4yIC0gYy4zKSwKICAgICAgICAgICBDMTlfMiA9IHBsb2dpcyhhbHBoYS4xOSArIGJldGEuMiAtIGMuMikgLSBwbG9naXMoYWxwaGEuMTkgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIEMyMF8yID0gcGxvZ2lzKGFscGhhLjIwICsgYmV0YS4yIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS4yMCArIGJldGEuMiAtIGMuMyksCiAgICAgICAgICAgQzIxXzIgPSBwbG9naXMoYWxwaGEuMjEgKyBiZXRhLjIgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjIxICsgYmV0YS4yIC0gYy4zKSwKICAgICAgICAgICBDMjJfMiA9IHBsb2dpcyhhbHBoYS4yMiArIGJldGEuMiAtIGMuMikgLSBwbG9naXMoYWxwaGEuMjIgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIEMyM18yID0gcGxvZ2lzKGFscGhhLjIzICsgYmV0YS4yIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS4yMyArIGJldGEuMiAtIGMuMyksCiAgICAgICAgICAgQzI0XzIgPSBwbG9naXMoYWxwaGEuMjQgKyBiZXRhLjIgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjI0ICsgYmV0YS4yIC0gYy4zKSwKICAgICAgICAgICBDMjVfMiA9IHBsb2dpcyhhbHBoYS4yNSArIGJldGEuMiAtIGMuMikgLSBwbG9naXMoYWxwaGEuMjUgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzFfMSA9IHBsb2dpcyhhbHBoYS4xICsgYmV0YS4xIC0gYy4zKSwKICAgICAgICAgICBERlcyXzEgPSBwbG9naXMoYWxwaGEuMiArIGJldGEuMSAtIGMuMyksCiAgICAgICAgICAgREZXM18xID0gcGxvZ2lzKGFscGhhLjMgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzRfMSA9IHBsb2dpcyhhbHBoYS40ICsgYmV0YS4xIC0gYy4zKSwKICAgICAgICAgICBERlc1XzEgPSBwbG9naXMoYWxwaGEuNSArIGJldGEuMSAtIGMuMyksCiAgICAgICAgICAgREZXNl8xID0gcGxvZ2lzKGFscGhhLjYgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzdfMSA9IHBsb2dpcyhhbHBoYS43ICsgYmV0YS4xIC0gYy4zKSwKICAgICAgICAgICBERlc4XzEgPSBwbG9naXMoYWxwaGEuOCArIGJldGEuMSAtIGMuMyksCiAgICAgICAgICAgREZXOV8xID0gcGxvZ2lzKGFscGhhLjkgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzEwXzEgPSBwbG9naXMoYWxwaGEuMTAgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzExXzEgPSBwbG9naXMoYWxwaGEuMTEgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzEyXzEgPSBwbG9naXMoYWxwaGEuMTIgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzEzXzEgPSBwbG9naXMoYWxwaGEuMTMgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzE0XzEgPSBwbG9naXMoYWxwaGEuMTQgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzE1XzEgPSBwbG9naXMoYWxwaGEuMTUgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzE2XzEgPSBwbG9naXMoYWxwaGEuMTYgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzE3XzEgPSBwbG9naXMoYWxwaGEuMTcgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzE4XzEgPSBwbG9naXMoYWxwaGEuMTggKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzE5XzEgPSBwbG9naXMoYWxwaGEuMTkgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzIwXzEgPSBwbG9naXMoYWxwaGEuMjAgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzIxXzEgPSBwbG9naXMoYWxwaGEuMjEgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzIyXzEgPSBwbG9naXMoYWxwaGEuMjIgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzIzXzEgPSBwbG9naXMoYWxwaGEuMjMgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzI0XzEgPSBwbG9naXMoYWxwaGEuMjQgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzI1XzEgPSBwbG9naXMoYWxwaGEuMjUgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzFfMiA9IHBsb2dpcyhhbHBoYS4xICsgYmV0YS4yIC0gYy4zKSwKICAgICAgICAgICBERlcyXzIgPSBwbG9naXMoYWxwaGEuMiArIGJldGEuMiAtIGMuMyksCiAgICAgICAgICAgREZXM18yID0gcGxvZ2lzKGFscGhhLjMgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzRfMiA9IHBsb2dpcyhhbHBoYS40ICsgYmV0YS4yIC0gYy4zKSwKICAgICAgICAgICBERlc1XzIgPSBwbG9naXMoYWxwaGEuNSArIGJldGEuMiAtIGMuMyksCiAgICAgICAgICAgREZXNl8yID0gcGxvZ2lzKGFscGhhLjYgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzdfMiA9IHBsb2dpcyhhbHBoYS43ICsgYmV0YS4yIC0gYy4zKSwKICAgICAgICAgICBERlc4XzIgPSBwbG9naXMoYWxwaGEuOCArIGJldGEuMiAtIGMuMyksCiAgICAgICAgICAgREZXOV8yID0gcGxvZ2lzKGFscGhhLjkgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzEwXzIgPSBwbG9naXMoYWxwaGEuMTAgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzExXzIgPSBwbG9naXMoYWxwaGEuMTEgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzEyXzIgPSBwbG9naXMoYWxwaGEuMTIgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzEzXzIgPSBwbG9naXMoYWxwaGEuMTMgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzE0XzIgPSBwbG9naXMoYWxwaGEuMTQgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzE1XzIgPSBwbG9naXMoYWxwaGEuMTUgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzE2XzIgPSBwbG9naXMoYWxwaGEuMTYgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzE3XzIgPSBwbG9naXMoYWxwaGEuMTcgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzE4XzIgPSBwbG9naXMoYWxwaGEuMTggKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzE5XzIgPSBwbG9naXMoYWxwaGEuMTkgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzIwXzIgPSBwbG9naXMoYWxwaGEuMjAgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzIxXzIgPSBwbG9naXMoYWxwaGEuMjEgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzIyXzIgPSBwbG9naXMoYWxwaGEuMjIgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzIzXzIgPSBwbG9naXMoYWxwaGEuMjMgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzI0XzIgPSBwbG9naXMoYWxwaGEuMjQgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzI1XzIgPSBwbG9naXMoYWxwaGEuMjUgKyBiZXRhLjIgLSBjLjMpKQpvcmRfbW1fdGlkeUFfMTIKYGBgCgpgYGB7cn0Kb3JkX21tX3RpZHlfZGlmZkFfMTIgPC0gb3JkX21tX3RpZHlBXzEyICU+JQogICAgdHJhbnNtdXRlKEExX2RpZmYgPSBBMV8yIC0gQTFfMSwKICAgICAgICAgICAgICBBMl9kaWZmID0gQTJfMiAtIEEyXzEsCiAgICAgICAgICAgICAgQTNfZGlmZiA9IEEzXzIgLSBBM18xLAogICAgICAgICAgICAgIEE0X2RpZmYgPSBBNF8yIC0gQTRfMSwKICAgICAgICAgICAgICBBNV9kaWZmID0gQTVfMiAtIEE1XzEsCiAgICAgICAgICAgICAgQTZfZGlmZiA9IEE2XzIgLSBBNl8xLAogICAgICAgICAgICAgIEE3X2RpZmYgPSBBN18yIC0gQTdfMSwKICAgICAgICAgICAgICBBOF9kaWZmID0gQThfMiAtIEE4XzEsCiAgICAgICAgICAgICAgQTlfZGlmZiA9IEE5XzIgLSBBOV8xLAogICAgICAgICAgICAgIEExMF9kaWZmID0gQTEwXzIgLSBBMTBfMSwKICAgICAgICAgICAgICBBMTFfZGlmZiA9IEExMV8yIC0gQTExXzEsCiAgICAgICAgICAgICAgQTEyX2RpZmYgPSBBMTJfMiAtIEExMl8xLAogICAgICAgICAgICAgIEExM19kaWZmID0gQTEzXzIgLSBBMTNfMSwKICAgICAgICAgICAgICBBMTRfZGlmZiA9IEExNF8yIC0gQTE0XzEsCiAgICAgICAgICAgICAgQTE1X2RpZmYgPSBBMTVfMiAtIEExNV8xLAogICAgICAgICAgICAgIEExNl9kaWZmID0gQTE2XzIgLSBBMTZfMSwKICAgICAgICAgICAgICBBMTdfZGlmZiA9IEExN18yIC0gQTE3XzEsCiAgICAgICAgICAgICAgQTE4X2RpZmYgPSBBMThfMiAtIEExOF8xLAogICAgICAgICAgICAgIEExOV9kaWZmID0gQTE5XzIgLSBBMTlfMSwKICAgICAgICAgICAgICBBMjBfZGlmZiA9IEEyMF8yIC0gQTIwXzEsCiAgICAgICAgICAgICAgQTIxX2RpZmYgPSBBMjFfMiAtIEEyMV8xLAogICAgICAgICAgICAgIEEyMl9kaWZmID0gQTIyXzIgLSBBMjJfMSwKICAgICAgICAgICAgICBBMjNfZGlmZiA9IEEyM18yIC0gQTIzXzEsCiAgICAgICAgICAgICAgQTI0X2RpZmYgPSBBMjRfMiAtIEEyNF8xLAogICAgICAgICAgICAgIEEyNV9kaWZmID0gQTI1XzIgLSBBMjVfMSwKICAgICAgICAgICAgICBCMV9kaWZmID0gQjFfMiAtIEIxXzEsCiAgICAgICAgICAgICAgQjJfZGlmZiA9IEIyXzIgLSBCMl8xLAogICAgICAgICAgICAgIEIzX2RpZmYgPSBCM18yIC0gQjNfMSwKICAgICAgICAgICAgICBCNF9kaWZmID0gQjRfMiAtIEI0XzEsCiAgICAgICAgICAgICAgQjVfZGlmZiA9IEI1XzIgLSBCNV8xLAogICAgICAgICAgICAgIEI2X2RpZmYgPSBCNl8yIC0gQjZfMSwKICAgICAgICAgICAgICBCN19kaWZmID0gQjdfMiAtIEI3XzEsCiAgICAgICAgICAgICAgQjhfZGlmZiA9IEI4XzIgLSBCOF8xLAogICAgICAgICAgICAgIEI5X2RpZmYgPSBCOV8yIC0gQjlfMSwKICAgICAgICAgICAgICBCMTBfZGlmZiA9IEIxMF8yIC0gQjEwXzEsCiAgICAgICAgICAgICAgQjExX2RpZmYgPSBCMTFfMiAtIEIxMV8xLAogICAgICAgICAgICAgIEIxMl9kaWZmID0gQjEyXzIgLSBCMTJfMSwKICAgICAgICAgICAgICBCMTNfZGlmZiA9IEIxM18yIC0gQjEzXzEsCiAgICAgICAgICAgICAgQjE0X2RpZmYgPSBCMTRfMiAtIEIxNF8xLAogICAgICAgICAgICAgIEIxNV9kaWZmID0gQjE1XzIgLSBCMTVfMSwKICAgICAgICAgICAgICBCMTZfZGlmZiA9IEIxNl8yIC0gQjE2XzEsCiAgICAgICAgICAgICAgQjE3X2RpZmYgPSBCMTdfMiAtIEIxN18xLAogICAgICAgICAgICAgIEIxOF9kaWZmID0gQjE4XzIgLSBCMThfMSwKICAgICAgICAgICAgICBCMTlfZGlmZiA9IEIxOV8yIC0gQjE5XzEsCiAgICAgICAgICAgICAgQjIwX2RpZmYgPSBCMjBfMiAtIEIyMF8xLAogICAgICAgICAgICAgIEIyMV9kaWZmID0gQjIxXzIgLSBCMjFfMSwKICAgICAgICAgICAgICBCMjJfZGlmZiA9IEIyMl8yIC0gQjIyXzEsCiAgICAgICAgICAgICAgQjIzX2RpZmYgPSBCMjNfMiAtIEIyM18xLAogICAgICAgICAgICAgIEIyNF9kaWZmID0gQjI0XzIgLSBCMjRfMSwKICAgICAgICAgICAgICBCMjVfZGlmZiA9IEIyNV8yIC0gQjI1XzEsCiAgICAgICAgICAgICAgQzFfZGlmZiA9IEMxXzIgLSBDMV8xLAogICAgICAgICAgICAgIEMyX2RpZmYgPSBDMl8yIC0gQzJfMSwKICAgICAgICAgICAgICBDM19kaWZmID0gQzNfMiAtIEMzXzEsCiAgICAgICAgICAgICAgQzRfZGlmZiA9IEM0XzIgLSBDNF8xLAogICAgICAgICAgICAgIEM1X2RpZmYgPSBDNV8yIC0gQzVfMSwKICAgICAgICAgICAgICBDNl9kaWZmID0gQzZfMiAtIEM2XzEsCiAgICAgICAgICAgICAgQzdfZGlmZiA9IEM3XzIgLSBDN18xLAogICAgICAgICAgICAgIEM4X2RpZmYgPSBDOF8yIC0gQzhfMSwKICAgICAgICAgICAgICBDOV9kaWZmID0gQzlfMiAtIEM5XzEsCiAgICAgICAgICAgICAgQzEwX2RpZmYgPSBDMTBfMiAtIEMxMF8xLAogICAgICAgICAgICAgIEMxMV9kaWZmID0gQzExXzIgLSBDMTFfMSwKICAgICAgICAgICAgICBDMTJfZGlmZiA9IEMxMl8yIC0gQzEyXzEsCiAgICAgICAgICAgICAgQzEzX2RpZmYgPSBDMTNfMiAtIEMxM18xLAogICAgICAgICAgICAgIEMxNF9kaWZmID0gQzE0XzIgLSBDMTRfMSwKICAgICAgICAgICAgICBDMTVfZGlmZiA9IEMxNV8yIC0gQzE1XzEsCiAgICAgICAgICAgICAgQzE2X2RpZmYgPSBDMTZfMiAtIEMxNl8xLAogICAgICAgICAgICAgIEMxN19kaWZmID0gQzE3XzIgLSBDMTdfMSwKICAgICAgICAgICAgICBDMThfZGlmZiA9IEMxOF8yIC0gQzE4XzEsCiAgICAgICAgICAgICAgQzE5X2RpZmYgPSBDMTlfMiAtIEMxOV8xLAogICAgICAgICAgICAgIEMyMF9kaWZmID0gQzIwXzIgLSBDMjBfMSwKICAgICAgICAgICAgICBDMjFfZGlmZiA9IEMyMV8yIC0gQzIxXzEsCiAgICAgICAgICAgICAgQzIyX2RpZmYgPSBDMjJfMiAtIEMyMl8xLAogICAgICAgICAgICAgIEMyM19kaWZmID0gQzIzXzIgLSBDMjNfMSwKICAgICAgICAgICAgICBDMjRfZGlmZiA9IEMyNF8yIC0gQzI0XzEsCiAgICAgICAgICAgICAgQzI1X2RpZmYgPSBDMjVfMiAtIEMyNV8xLAogICAgICAgICAgICAgIERGVzFfZGlmZiA9IERGVzFfMiAtIERGVzFfMSwKICAgICAgICAgICAgICBERlcyX2RpZmYgPSBERlcyXzIgLSBERlcyXzEsCiAgICAgICAgICAgICAgREZXM19kaWZmID0gREZXM18yIC0gREZXM18xLAogICAgICAgICAgICAgIERGVzRfZGlmZiA9IERGVzRfMiAtIERGVzRfMSwKICAgICAgICAgICAgICBERlc1X2RpZmYgPSBERlc1XzIgLSBERlc1XzEsCiAgICAgICAgICAgICAgREZXNl9kaWZmID0gREZXNl8yIC0gREZXNl8xLAogICAgICAgICAgICAgIERGVzdfZGlmZiA9IERGVzdfMiAtIERGVzdfMSwKICAgICAgICAgICAgICBERlc4X2RpZmYgPSBERlc4XzIgLSBERlc4XzEsCiAgICAgICAgICAgICAgREZXOV9kaWZmID0gREZXOV8yIC0gREZXOV8xLAogICAgICAgICAgICAgIERGVzEwX2RpZmYgPSBERlcxMF8yIC0gREZXMTBfMSwKICAgICAgICAgICAgICBERlcxMV9kaWZmID0gREZXMTFfMiAtIERGVzExXzEsCiAgICAgICAgICAgICAgREZXMTJfZGlmZiA9IERGVzEyXzIgLSBERlcxMl8xLAogICAgICAgICAgICAgIERGVzEzX2RpZmYgPSBERlcxM18yIC0gREZXMTNfMSwKICAgICAgICAgICAgICBERlcxNF9kaWZmID0gREZXMTRfMiAtIERGVzE0XzEsCiAgICAgICAgICAgICAgREZXMTVfZGlmZiA9IERGVzE1XzIgLSBERlcxNV8xLAogICAgICAgICAgICAgIERGVzE2X2RpZmYgPSBERlcxNl8yIC0gREZXMTZfMSwKICAgICAgICAgICAgICBERlcxN19kaWZmID0gREZXMTdfMiAtIERGVzE3XzEsCiAgICAgICAgICAgICAgREZXMThfZGlmZiA9IERGVzE4XzIgLSBERlcxOF8xLAogICAgICAgICAgICAgIERGVzE5X2RpZmYgPSBERlcxOV8yIC0gREZXMTlfMSwKICAgICAgICAgICAgICBERlcyMF9kaWZmID0gREZXMjBfMiAtIERGVzIwXzEsCiAgICAgICAgICAgICAgREZXMjFfZGlmZiA9IERGVzIxXzIgLSBERlcyMV8xLAogICAgICAgICAgICAgIERGVzIyX2RpZmYgPSBERlcyMl8yIC0gREZXMjJfMSwKICAgICAgICAgICAgICBERlcyM19kaWZmID0gREZXMjNfMiAtIERGVzIzXzEsCiAgICAgICAgICAgICAgREZXMjRfZGlmZiA9IERGVzI0XzIgLSBERlcyNF8xLAogICAgICAgICAgICAgIERGVzI1X2RpZmYgPSBERlcyNV8yIC0gREZXMjVfMSkKb3JkX21tX3RpZHlfZGlmZkFfMTIKYGBgCgpgYGB7cn0Kb3JkX21tX2xvbmdfZGlmZkFfMTIgPC0gb3JkX21tX3RpZHlfZGlmZkFfMTIgJT4lCiAgICBwaXZvdF9sb25nZXIoY29scyA9IHN0YXJ0c193aXRoKGMoIkEiLCAiQiIsICJDIiwgIkRGVyIpKSwKICAgICAgICAgICAgICAgICBuYW1lc190byA9ICJncmFkZV9kaWZmIiwKICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAicHJvcCIpCm9yZF9tbV9sb25nX2RpZmZBXzEyCmBgYAoKYGBge3J9Cm9yZF9tbV9sb25nX2RpZmZfZ3JvdXBlZEFfMTIgPC0gb3JkX21tX2xvbmdfZGlmZkFfMTIgJT4lCiAgbXV0YXRlKGdyYWRlX2RpZmZfZ3JvdXBlZCA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KGdyYWRlX2RpZmYsICJeQSIpIH4gIkEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChncmFkZV9kaWZmLCAiXkIiKSB+ICJCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZ3JhZGVfZGlmZiwgIl5DIikgfiAiQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGdyYWRlX2RpZmYsICJeREZXIikgfiAiREZXIikpCm9yZF9tbV9sb25nX2RpZmZfZ3JvdXBlZEFfMTIKYGBgCgpgYGB7cn0Kb3JkX21tX2xvbmdfZGlmZl9ncm91cGVkQV8xMiAlPiUKICAgIGdncGxvdChhZXMoeSA9IGZjdF9yZXYoZ3JhZGVfZGlmZl9ncm91cGVkKSwgeCA9IHByb3ApKSArCiAgICAgICAgc3RhdF9oYWxmZXllKCkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAiYmx1ZSIpCmBgYAoKIyMjIFBoYXNlIDEgdG8gUGhhc2UgMwoKYGBge3J9Cm9yZF9tbV90aWR5QV8xMyA8LSBvcmRfbW1fZml0QV8xMyAlPiUKICAgIHNwcmVhZF9kcmF3cyhhbHBoYVsuLl0sIGJldGFbLi5dLCBjWy4uXSkgJT4lCiAgICBtdXRhdGUob3IgPSBleHAoYmV0YS4xIC0gYmV0YS4yKSwKICAgICAgICAgICBBMV8xID0gMSAtIHBsb2dpcyhhbHBoYS4xICsgYmV0YS4xIC0gYy4xKSwKICAgICAgICAgICBBMl8xID0gMSAtIHBsb2dpcyhhbHBoYS4yICsgYmV0YS4xIC0gYy4xKSwKICAgICAgICAgICBBM18xID0gMSAtIHBsb2dpcyhhbHBoYS4zICsgYmV0YS4xIC0gYy4xKSwKICAgICAgICAgICBBNF8xID0gMSAtIHBsb2dpcyhhbHBoYS40ICsgYmV0YS4xIC0gYy4xKSwKICAgICAgICAgICBBNV8xID0gMSAtIHBsb2dpcyhhbHBoYS41ICsgYmV0YS4xIC0gYy4xKSwKICAgICAgICAgICBBNl8xID0gMSAtIHBsb2dpcyhhbHBoYS42ICsgYmV0YS4xIC0gYy4xKSwKICAgICAgICAgICBBN18xID0gMSAtIHBsb2dpcyhhbHBoYS43ICsgYmV0YS4xIC0gYy4xKSwKICAgICAgICAgICBBOF8xID0gMSAtIHBsb2dpcyhhbHBoYS44ICsgYmV0YS4xIC0gYy4xKSwKICAgICAgICAgICBBOV8xID0gMSAtIHBsb2dpcyhhbHBoYS45ICsgYmV0YS4xIC0gYy4xKSwKICAgICAgICAgICBBMTBfMSA9IDEgLSBwbG9naXMoYWxwaGEuMTAgKyBiZXRhLjEgLSBjLjEpLAogICAgICAgICAgIEExMV8xID0gMSAtIHBsb2dpcyhhbHBoYS4xMSArIGJldGEuMSAtIGMuMSksCiAgICAgICAgICAgQTFfMyA9IDEgLSBwbG9naXMoYWxwaGEuMSArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQTJfMyA9IDEgLSBwbG9naXMoYWxwaGEuMiArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQTNfMyA9IDEgLSBwbG9naXMoYWxwaGEuMyArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQTRfMyA9IDEgLSBwbG9naXMoYWxwaGEuNCArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQTVfMyA9IDEgLSBwbG9naXMoYWxwaGEuNSArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQTZfMyA9IDEgLSBwbG9naXMoYWxwaGEuNiArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQTdfMyA9IDEgLSBwbG9naXMoYWxwaGEuNyArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQThfMyA9IDEgLSBwbG9naXMoYWxwaGEuOCArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQTlfMyA9IDEgLSBwbG9naXMoYWxwaGEuOSArIGJldGEuMiAtIGMuMSksCiAgICAgICAgICAgQTEwXzMgPSAxIC0gcGxvZ2lzKGFscGhhLjEwICsgYmV0YS4yIC0gYy4xKSwKICAgICAgICAgICBBMTFfMyA9IDEgLSBwbG9naXMoYWxwaGEuMTEgKyBiZXRhLjIgLSBjLjEpLAogICAgICAgICAgIEIxXzEgPSBwbG9naXMoYWxwaGEuMSArIGJldGEuMSAtIGMuMSkgLSBwbG9naXMoYWxwaGEuMSArIGJldGEuMSAtIGMuMiksCiAgICAgICAgICAgQjJfMSA9IHBsb2dpcyhhbHBoYS4yICsgYmV0YS4xIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS4yICsgYmV0YS4xIC0gYy4yKSwKICAgICAgICAgICBCM18xID0gcGxvZ2lzKGFscGhhLjMgKyBiZXRhLjEgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjMgKyBiZXRhLjEgLSBjLjIpLAogICAgICAgICAgIEI0XzEgPSBwbG9naXMoYWxwaGEuNCArIGJldGEuMSAtIGMuMSkgLSBwbG9naXMoYWxwaGEuNCArIGJldGEuMSAtIGMuMiksCiAgICAgICAgICAgQjVfMSA9IHBsb2dpcyhhbHBoYS41ICsgYmV0YS4xIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS41ICsgYmV0YS4xIC0gYy4yKSwKICAgICAgICAgICBCNl8xID0gcGxvZ2lzKGFscGhhLjYgKyBiZXRhLjEgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjYgKyBiZXRhLjEgLSBjLjIpLAogICAgICAgICAgIEI3XzEgPSBwbG9naXMoYWxwaGEuNyArIGJldGEuMSAtIGMuMSkgLSBwbG9naXMoYWxwaGEuNyArIGJldGEuMSAtIGMuMiksCiAgICAgICAgICAgQjhfMSA9IHBsb2dpcyhhbHBoYS44ICsgYmV0YS4xIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS44ICsgYmV0YS4xIC0gYy4yKSwKICAgICAgICAgICBCOV8xID0gcGxvZ2lzKGFscGhhLjkgKyBiZXRhLjEgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjkgKyBiZXRhLjEgLSBjLjIpLAogICAgICAgICAgIEIxMF8xID0gcGxvZ2lzKGFscGhhLjEwICsgYmV0YS4xIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS4xMCArIGJldGEuMSAtIGMuMiksCiAgICAgICAgICAgQjExXzEgPSBwbG9naXMoYWxwaGEuMTEgKyBiZXRhLjEgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjExICsgYmV0YS4xIC0gYy4yKSwKICAgICAgICAgICBCMV8zID0gcGxvZ2lzKGFscGhhLjEgKyBiZXRhLjIgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjEgKyBiZXRhLjIgLSBjLjIpLAogICAgICAgICAgIEIyXzMgPSBwbG9naXMoYWxwaGEuMiArIGJldGEuMiAtIGMuMSkgLSBwbG9naXMoYWxwaGEuMiArIGJldGEuMiAtIGMuMiksCiAgICAgICAgICAgQjNfMyA9IHBsb2dpcyhhbHBoYS4zICsgYmV0YS4yIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS4zICsgYmV0YS4yIC0gYy4yKSwKICAgICAgICAgICBCNF8zID0gcGxvZ2lzKGFscGhhLjQgKyBiZXRhLjIgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjQgKyBiZXRhLjIgLSBjLjIpLAogICAgICAgICAgIEI1XzMgPSBwbG9naXMoYWxwaGEuNSArIGJldGEuMiAtIGMuMSkgLSBwbG9naXMoYWxwaGEuNSArIGJldGEuMiAtIGMuMiksCiAgICAgICAgICAgQjZfMyA9IHBsb2dpcyhhbHBoYS42ICsgYmV0YS4yIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS42ICsgYmV0YS4yIC0gYy4yKSwKICAgICAgICAgICBCN18zID0gcGxvZ2lzKGFscGhhLjcgKyBiZXRhLjIgLSBjLjEpIC0gcGxvZ2lzKGFscGhhLjcgKyBiZXRhLjIgLSBjLjIpLAogICAgICAgICAgIEI4XzMgPSBwbG9naXMoYWxwaGEuOCArIGJldGEuMiAtIGMuMSkgLSBwbG9naXMoYWxwaGEuOCArIGJldGEuMiAtIGMuMiksCiAgICAgICAgICAgQjlfMyA9IHBsb2dpcyhhbHBoYS45ICsgYmV0YS4yIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS45ICsgYmV0YS4yIC0gYy4yKSwKICAgICAgICAgICBCMTBfMyA9IHBsb2dpcyhhbHBoYS4xMCArIGJldGEuMiAtIGMuMSkgLSBwbG9naXMoYWxwaGEuMTAgKyBiZXRhLjIgLSBjLjIpLAogICAgICAgICAgIEIxMV8zID0gcGxvZ2lzKGFscGhhLjExICsgYmV0YS4yIC0gYy4xKSAtIHBsb2dpcyhhbHBoYS4xMSArIGJldGEuMiAtIGMuMiksCiAgICAgICAgICAgQzFfMSA9IHBsb2dpcyhhbHBoYS4xICsgYmV0YS4xIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS4xICsgYmV0YS4xIC0gYy4zKSwKICAgICAgICAgICBDMl8xID0gcGxvZ2lzKGFscGhhLjIgKyBiZXRhLjEgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjIgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIEMzXzEgPSBwbG9naXMoYWxwaGEuMyArIGJldGEuMSAtIGMuMikgLSBwbG9naXMoYWxwaGEuMyArIGJldGEuMSAtIGMuMyksCiAgICAgICAgICAgQzRfMSA9IHBsb2dpcyhhbHBoYS40ICsgYmV0YS4xIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS40ICsgYmV0YS4xIC0gYy4zKSwKICAgICAgICAgICBDNV8xID0gcGxvZ2lzKGFscGhhLjUgKyBiZXRhLjEgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjUgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIEM2XzEgPSBwbG9naXMoYWxwaGEuNiArIGJldGEuMSAtIGMuMikgLSBwbG9naXMoYWxwaGEuNiArIGJldGEuMSAtIGMuMyksCiAgICAgICAgICAgQzdfMSA9IHBsb2dpcyhhbHBoYS43ICsgYmV0YS4xIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS43ICsgYmV0YS4xIC0gYy4zKSwKICAgICAgICAgICBDOF8xID0gcGxvZ2lzKGFscGhhLjggKyBiZXRhLjEgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjggKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIEM5XzEgPSBwbG9naXMoYWxwaGEuOSArIGJldGEuMSAtIGMuMikgLSBwbG9naXMoYWxwaGEuOSArIGJldGEuMSAtIGMuMyksCiAgICAgICAgICAgQzEwXzEgPSBwbG9naXMoYWxwaGEuMTAgKyBiZXRhLjEgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjEwICsgYmV0YS4xIC0gYy4zKSwKICAgICAgICAgICBDMTFfMSA9IHBsb2dpcyhhbHBoYS4xMSArIGJldGEuMSAtIGMuMikgLSBwbG9naXMoYWxwaGEuMTEgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIEMxXzMgPSBwbG9naXMoYWxwaGEuMSArIGJldGEuMiAtIGMuMikgLSBwbG9naXMoYWxwaGEuMSArIGJldGEuMiAtIGMuMyksCiAgICAgICAgICAgQzJfMyA9IHBsb2dpcyhhbHBoYS4yICsgYmV0YS4yIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS4yICsgYmV0YS4yIC0gYy4zKSwKICAgICAgICAgICBDM18zID0gcGxvZ2lzKGFscGhhLjMgKyBiZXRhLjIgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjMgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIEM0XzMgPSBwbG9naXMoYWxwaGEuNCArIGJldGEuMiAtIGMuMikgLSBwbG9naXMoYWxwaGEuNCArIGJldGEuMiAtIGMuMyksCiAgICAgICAgICAgQzVfMyA9IHBsb2dpcyhhbHBoYS41ICsgYmV0YS4yIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS41ICsgYmV0YS4yIC0gYy4zKSwKICAgICAgICAgICBDNl8zID0gcGxvZ2lzKGFscGhhLjYgKyBiZXRhLjIgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjYgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIEM3XzMgPSBwbG9naXMoYWxwaGEuNyArIGJldGEuMiAtIGMuMikgLSBwbG9naXMoYWxwaGEuNyArIGJldGEuMiAtIGMuMyksCiAgICAgICAgICAgQzhfMyA9IHBsb2dpcyhhbHBoYS44ICsgYmV0YS4yIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS44ICsgYmV0YS4yIC0gYy4zKSwKICAgICAgICAgICBDOV8zID0gcGxvZ2lzKGFscGhhLjkgKyBiZXRhLjIgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjkgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIEMxMF8zID0gcGxvZ2lzKGFscGhhLjEwICsgYmV0YS4yIC0gYy4yKSAtIHBsb2dpcyhhbHBoYS4xMCArIGJldGEuMiAtIGMuMyksCiAgICAgICAgICAgQzExXzMgPSBwbG9naXMoYWxwaGEuMTEgKyBiZXRhLjIgLSBjLjIpIC0gcGxvZ2lzKGFscGhhLjExICsgYmV0YS4yIC0gYy4zKSwKICAgICAgICAgICBERlcxXzEgPSBwbG9naXMoYWxwaGEuMSArIGJldGEuMSAtIGMuMyksCiAgICAgICAgICAgREZXMl8xID0gcGxvZ2lzKGFscGhhLjIgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzNfMSA9IHBsb2dpcyhhbHBoYS4zICsgYmV0YS4xIC0gYy4zKSwKICAgICAgICAgICBERlc0XzEgPSBwbG9naXMoYWxwaGEuNCArIGJldGEuMSAtIGMuMyksCiAgICAgICAgICAgREZXNV8xID0gcGxvZ2lzKGFscGhhLjUgKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzZfMSA9IHBsb2dpcyhhbHBoYS42ICsgYmV0YS4xIC0gYy4zKSwKICAgICAgICAgICBERlc3XzEgPSBwbG9naXMoYWxwaGEuNyArIGJldGEuMSAtIGMuMyksCiAgICAgICAgICAgREZXOF8xID0gcGxvZ2lzKGFscGhhLjggKyBiZXRhLjEgLSBjLjMpLAogICAgICAgICAgIERGVzlfMSA9IHBsb2dpcyhhbHBoYS45ICsgYmV0YS4xIC0gYy4zKSwKICAgICAgICAgICBERlcxMF8xID0gcGxvZ2lzKGFscGhhLjEwICsgYmV0YS4xIC0gYy4zKSwKICAgICAgICAgICBERlcxMV8xID0gcGxvZ2lzKGFscGhhLjExICsgYmV0YS4xIC0gYy4zKSwKICAgICAgICAgICBERlcxXzMgPSBwbG9naXMoYWxwaGEuMSArIGJldGEuMiAtIGMuMyksCiAgICAgICAgICAgREZXMl8zID0gcGxvZ2lzKGFscGhhLjIgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzNfMyA9IHBsb2dpcyhhbHBoYS4zICsgYmV0YS4yIC0gYy4zKSwKICAgICAgICAgICBERlc0XzMgPSBwbG9naXMoYWxwaGEuNCArIGJldGEuMiAtIGMuMyksCiAgICAgICAgICAgREZXNV8zID0gcGxvZ2lzKGFscGhhLjUgKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzZfMyA9IHBsb2dpcyhhbHBoYS42ICsgYmV0YS4yIC0gYy4zKSwKICAgICAgICAgICBERlc3XzMgPSBwbG9naXMoYWxwaGEuNyArIGJldGEuMiAtIGMuMyksCiAgICAgICAgICAgREZXOF8zID0gcGxvZ2lzKGFscGhhLjggKyBiZXRhLjIgLSBjLjMpLAogICAgICAgICAgIERGVzlfMyA9IHBsb2dpcyhhbHBoYS45ICsgYmV0YS4yIC0gYy4zKSwKICAgICAgICAgICBERlcxMF8zID0gcGxvZ2lzKGFscGhhLjEwICsgYmV0YS4yIC0gYy4zKSwKICAgICAgICAgICBERlcxMV8zID0gcGxvZ2lzKGFscGhhLjExICsgYmV0YS4yIC0gYy4zKSkKb3JkX21tX3RpZHlBXzEzCmBgYAoKYGBge3J9Cm9yZF9tbV90aWR5X2RpZmZBXzEzIDwtIG9yZF9tbV90aWR5QV8xMyAlPiUKICAgIHRyYW5zbXV0ZShBMV9kaWZmID0gQTFfMyAtIEExXzEsCiAgICAgICAgICAgICAgQTJfZGlmZiA9IEEyXzMgLSBBMl8xLAogICAgICAgICAgICAgIEEzX2RpZmYgPSBBM18zIC0gQTNfMSwKICAgICAgICAgICAgICBBNF9kaWZmID0gQTRfMyAtIEE0XzEsCiAgICAgICAgICAgICAgQTVfZGlmZiA9IEE1XzMgLSBBNV8xLAogICAgICAgICAgICAgIEE2X2RpZmYgPSBBNl8zIC0gQTZfMSwKICAgICAgICAgICAgICBBN19kaWZmID0gQTdfMyAtIEE3XzEsCiAgICAgICAgICAgICAgQThfZGlmZiA9IEE4XzMgLSBBOF8xLAogICAgICAgICAgICAgIEE5X2RpZmYgPSBBOV8zIC0gQTlfMSwKICAgICAgICAgICAgICBBMTBfZGlmZiA9IEExMF8zIC0gQTEwXzEsCiAgICAgICAgICAgICAgQTExX2RpZmYgPSBBMTFfMyAtIEExMV8xLAogICAgICAgICAgICAgIEIxX2RpZmYgPSBCMV8zIC0gQjFfMSwKICAgICAgICAgICAgICBCMl9kaWZmID0gQjJfMyAtIEIyXzEsCiAgICAgICAgICAgICAgQjNfZGlmZiA9IEIzXzMgLSBCM18xLAogICAgICAgICAgICAgIEI0X2RpZmYgPSBCNF8zIC0gQjRfMSwKICAgICAgICAgICAgICBCNV9kaWZmID0gQjVfMyAtIEI1XzEsCiAgICAgICAgICAgICAgQjZfZGlmZiA9IEI2XzMgLSBCNl8xLAogICAgICAgICAgICAgIEI3X2RpZmYgPSBCN18zIC0gQjdfMSwKICAgICAgICAgICAgICBCOF9kaWZmID0gQjhfMyAtIEI4XzEsCiAgICAgICAgICAgICAgQjlfZGlmZiA9IEI5XzMgLSBCOV8xLAogICAgICAgICAgICAgIEIxMF9kaWZmID0gQjEwXzMgLSBCMTBfMSwKICAgICAgICAgICAgICBCMTFfZGlmZiA9IEIxMV8zIC0gQjExXzEsCiAgICAgICAgICAgICAgQzFfZGlmZiA9IEMxXzMgLSBDMV8xLAogICAgICAgICAgICAgIEMyX2RpZmYgPSBDMl8zIC0gQzJfMSwKICAgICAgICAgICAgICBDM19kaWZmID0gQzNfMyAtIEMzXzEsCiAgICAgICAgICAgICAgQzRfZGlmZiA9IEM0XzMgLSBDNF8xLAogICAgICAgICAgICAgIEM1X2RpZmYgPSBDNV8zIC0gQzVfMSwKICAgICAgICAgICAgICBDNl9kaWZmID0gQzZfMyAtIEM2XzEsCiAgICAgICAgICAgICAgQzdfZGlmZiA9IEM3XzMgLSBDN18xLAogICAgICAgICAgICAgIEM4X2RpZmYgPSBDOF8zIC0gQzhfMSwKICAgICAgICAgICAgICBDOV9kaWZmID0gQzlfMyAtIEM5XzEsCiAgICAgICAgICAgICAgQzEwX2RpZmYgPSBDMTBfMyAtIEMxMF8xLAogICAgICAgICAgICAgIEMxMV9kaWZmID0gQzExXzMgLSBDMTFfMSwKICAgICAgICAgICAgICBERlcxX2RpZmYgPSBERlcxXzMgLSBERlcxXzEsCiAgICAgICAgICAgICAgREZXMl9kaWZmID0gREZXMl8zIC0gREZXMl8xLAogICAgICAgICAgICAgIERGVzNfZGlmZiA9IERGVzNfMyAtIERGVzNfMSwKICAgICAgICAgICAgICBERlc0X2RpZmYgPSBERlc0XzMgLSBERlc0XzEsCiAgICAgICAgICAgICAgREZXNV9kaWZmID0gREZXNV8zIC0gREZXNV8xLAogICAgICAgICAgICAgIERGVzZfZGlmZiA9IERGVzZfMyAtIERGVzZfMSwKICAgICAgICAgICAgICBERlc3X2RpZmYgPSBERlc3XzMgLSBERlc3XzEsCiAgICAgICAgICAgICAgREZXOF9kaWZmID0gREZXOF8zIC0gREZXOF8xLAogICAgICAgICAgICAgIERGVzlfZGlmZiA9IERGVzlfMyAtIERGVzlfMSwKICAgICAgICAgICAgICBERlcxMF9kaWZmID0gREZXMTBfMyAtIERGVzEwXzEsCiAgICAgICAgICAgICAgREZXMTFfZGlmZiA9IERGVzExXzMgLSBERlcxMV8xKQpvcmRfbW1fdGlkeV9kaWZmQV8xMwpgYGAKCmBgYHtyfQpvcmRfbW1fbG9uZ19kaWZmQV8xMyA8LSBvcmRfbW1fdGlkeV9kaWZmQV8xMyAlPiUKICAgIHBpdm90X2xvbmdlcihjb2xzID0gc3RhcnRzX3dpdGgoYygiQSIsICJCIiwgIkMiLCAiREZXIikpLAogICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gImdyYWRlX2RpZmYiLAogICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJwcm9wIikKb3JkX21tX2xvbmdfZGlmZkFfMTMKYGBgCgpgYGB7cn0Kb3JkX21tX2xvbmdfZGlmZl9ncm91cGVkQV8xMyA8LSBvcmRfbW1fbG9uZ19kaWZmQV8xMyAlPiUKICBtdXRhdGUoZ3JhZGVfZGlmZl9ncm91cGVkID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoZ3JhZGVfZGlmZiwgIl5BIikgfiAiQSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGdyYWRlX2RpZmYsICJeQiIpIH4gIkIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChncmFkZV9kaWZmLCAiXkMiKSB+ICJDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZ3JhZGVfZGlmZiwgIl5ERlciKSB+ICJERlciKSkKb3JkX21tX2xvbmdfZGlmZl9ncm91cGVkQV8xMwpgYGAKCmBgYHtyfQpvcmRfbW1fbG9uZ19kaWZmX2dyb3VwZWRBXzEzICU+JQogICAgZ2dwbG90KGFlcyh5ID0gZmN0X3JldihncmFkZV9kaWZmX2dyb3VwZWQpLCB4ID0gcHJvcCkpICsKICAgICAgICBzdGF0X2hhbGZleWUoKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJibHVlIikKYGBgCgoKIyMgR3JhcGhzIGZvciBwdWJsaWNhdGlvbgoKU2V0IHRoZW1lIGZvciBzbWFsbGVyIGdyYXBoczoKCmBgYHtyfQpwdWJfdGhlbWVfQSA9IHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCnB1Yl90aGVtZV9CID0gdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpLAogICAgICAgICAgICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSkpCmBgYAoKCiMjIyBHcmFkZXMKCiMjIyMgUGhhc2UgMSB0byBQaGFzZSAyCgpTaG93cyBmYWN1bHR5IHdpdGggb25seSBQaGFzZSAxIGFuZCBQaGFzZSAyIGRhdGEuCgpgYGB7ciwgZmlnLndpZHRoID0gOH0KZF9hbGwgJT4lCiAgICBmaWx0ZXIocGhhc2VfY29sbCA9PSAxIHwgcGhhc2VfY29sbCA9PSAyKSAlPiUKICAgIGZpbHRlcihmYWN1bHR5X2luZCA+IDExKSAlPiUKICAgIGdyb3VwX2J5KHBoYXNlLCBmYWN1bHR5X2luZCwgZ3JhZGUpICU+JQogICAgY291bnQoKSAlPiUKICAgIGdyb3VwX2J5KHBoYXNlLCBmYWN1bHR5X2luZCkgJT4lCiAgICBtdXRhdGUocHJvcCA9IG4vc3VtKG4pKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IGdyYWRlLCB5ID0gcHJvcCkpICsKICAgICAgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogICAgICAgIGZhY2V0X2dyaWQocGhhc2UgfiBmYWN1bHR5X2luZCApKwogICAgICAgIGxhYnMoeCA9ICJHcmFkZSIsCiAgICAgICAgICAgICB5ID0gIlByb3BvcnRpb24iKQpgYGAKCmBgYHtyfQpnZ3NhdmUoIi4vZ3JhcGhpY3MvcGhhc2UxMl9hbGxfZ3JhZGVzLnBkZiIsIGRldmljZSA9ICJwZGYiLCB3aWR0aCA9IDgsIGhlaWdodCA9IDMpCmBgYAoKIyMjIyBQaGFzZSAxIHRvIFBoYXNlIDMKClNob3dzIGZhY3VsdHkgd2l0aCBhbGwgdGhyZWUgcGhhc2VzLgoKYGBge3IsIGZpZy53aWR0aCA9IDh9CmRfYWxsICU+JQogICAgZmlsdGVyKGZhY3VsdHlfaW5kIDw9IDExKSAlPiUKICAgIGdyb3VwX2J5KHBoYXNlLCBmYWN1bHR5X2luZCwgZ3JhZGUpICU+JQogICAgY291bnQoKSAlPiUKICAgIGdyb3VwX2J5KHBoYXNlLCBmYWN1bHR5X2luZCkgJT4lCiAgICBtdXRhdGUocHJvcCA9IG4vc3VtKG4pKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IGdyYWRlLCB5ID0gcHJvcCkpICsKICAgICAgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogICAgICAgIGZhY2V0X2dyaWQocGhhc2UgfiBmYWN1bHR5X2luZCApKwogICAgICAgIGxhYnMoeCA9ICJHcmFkZSIsCiAgICAgICAgICAgICB5ID0gIlByb3BvcnRpb24iKQpgYGAKCmBgYHtyfQpnZ3NhdmUoIi4vZ3JhcGhpY3MvcGhhc2UxMjNfYWxsX2dyYWRlcy5wZGYiLCBkZXZpY2UgPSAicGRmIiwgd2lkdGggPSA4LCBoZWlnaHQgPSA1KQpgYGAKCiMjIyBPZGRzIHJhdGlvcwoKIyMjIyBNb2RlbCBBCgpgYGB7cn0Kb3JBXzEyX3Bvc3QgPC0gZ2dwbG90KG9yZF9tbV90aWR5QV8xMiwgYWVzKHggPSBvcikpICsKICAgIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gYWZ0ZXJfc3RhdChkZW5zaXR5KSkpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEsIGNvbG9yID0gImJsdWUiKSArCiAgICBsYWJzKHggPSAiT2RkcyByYXRpbyIsCiAgICAgICAgIHkgPSAiUHJvYmFiaWxpdHkgZGVuc2l0eSIsCiAgICAgICAgIHRpdGxlID0gIk1vZGVsIEEiLAogICAgICAgICBzdWJ0aXRsZSA9ICJQaGFzZSAxIHRvIFBoYXNlIDIiKSArCiAgICBwdWJfdGhlbWVfQQpvckFfMTJfcG9zdApgYGAKCmBgYHtyfQpvckFfMTNfcG9zdCA8LSBnZ3Bsb3Qob3JkX21tX3RpZHlBXzEzLCBhZXMoeCA9IG9yKSkgKwogICAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSBhZnRlcl9zdGF0KGRlbnNpdHkpKSkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMSwgY29sb3IgPSAiYmx1ZSIpICsKICAgIGxhYnMoeCA9ICJPZGRzIHJhdGlvIiwKICAgICAgICAgeSA9ICJQcm9iYWJpbGl0eSBkZW5zaXR5IiwKICAgICAgICAgc3VidGl0bGUgPSAiUGhhc2UgMSB0byBQaGFzZSAzIikgKwogICAgcHViX3RoZW1lX0EKb3JBXzEzX3Bvc3QKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gOH0Kb3JBXzEyX3Bvc3QgKyBvckFfMTNfcG9zdApgYGAKCmBgYHtyfQpnZ3NhdmUoIi4vZ3JhcGhpY3Mvb3JBX3Bvc3QucGRmIiwgZGV2aWNlID0gInBkZiIsIHdpZHRoID0gOCwgaGVpZ2h0ID0gMykKYGBgCgojIyMjIE1vZGVsIEIKCiMjIyMjIFBoYXNlIDEgdG8gUGhhc2UgMgoKYGBge3J9Cm9yQl8xMl9tZW5fQkhJX3Bvc3QgPC0gZ2dwbG90KG9yZF9tbV90aWR5Ql8xMiwgYWVzKHggPSBvcl9tZW5fQkhJKSkgKwogICAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSBhZnRlcl9zdGF0KGRlbnNpdHkpKSkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMSwgY29sb3IgPSAiYmx1ZSIpICsKICAgIGxhYnMoeCA9ICJPZGRzIHJhdGlvIiwKICAgICAgICAgeSA9ICJQcm9iYWJpbGl0eSBkZW5zaXR5IiwKICAgICAgICAgdGl0bGUgPSAiTW9kZWwgQiwgUGhhc2UgMSB0byBQaGFzZSAyIiwKICAgICAgICAgc3VidGl0bGUgPSAiTWVuOiBCbGFjaywgSGlzcGFuaWMsIG9yIEluZGlnZW5vdXMiKSArCiAgICBwdWJfdGhlbWVfQgpvckJfMTJfbWVuX0JISV9wb3N0CmBgYAoKYGBge3J9Cm9yQl8xMl93b21lbl9CSElfcG9zdCA8LSBnZ3Bsb3Qob3JkX21tX3RpZHlCXzEyLCBhZXMoeCA9IG9yX3dvbWVuX0JISSkpICsKICAgIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gYWZ0ZXJfc3RhdChkZW5zaXR5KSkpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEsIGNvbG9yID0gImJsdWUiKSArCiAgICBsYWJzKHggPSAiT2RkcyByYXRpbyIsCiAgICAgICAgIHkgPSAiUHJvYmFiaWxpdHkgZGVuc2l0eSIsCiAgICAgICAgIHN1YnRpdGxlID0gIldvbWVuOiBCbGFjaywgSGlzcGFuaWMsIG9yIEluZGlnZW5vdXMiKSArCiAgICBwdWJfdGhlbWVfQgpvckJfMTJfd29tZW5fQkhJX3Bvc3QKYGBgCgpgYGB7cn0Kb3JCXzEyX21lbl9XQV9wb3N0IDwtIGdncGxvdChvcmRfbW1fdGlkeUJfMTIsIGFlcyh4ID0gb3JfbWVuX1dBKSkgKwogICAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSBhZnRlcl9zdGF0KGRlbnNpdHkpKSkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMSwgY29sb3IgPSAiYmx1ZSIpICsKICAgIGxhYnMoeCA9ICJPZGRzIHJhdGlvIiwKICAgICAgICAgeSA9ICJQcm9iYWJpbGl0eSBkZW5zaXR5IiwKICAgICAgICAgc3VidGl0bGUgPSAiTWVuOiBXaGl0ZSBvciBBc2lhbiIpICsKICAgIHB1Yl90aGVtZV9CCm9yQl8xMl9tZW5fV0FfcG9zdApgYGAKCmBgYHtyfQpvckJfMTJfd29tZW5fV0FfcG9zdCA8LSBnZ3Bsb3Qob3JkX21tX3RpZHlCXzEyLCBhZXMoeCA9IG9yX3dvbWVuX1dBKSkgKwogICAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSBhZnRlcl9zdGF0KGRlbnNpdHkpKSkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMSwgY29sb3IgPSAiYmx1ZSIpICsKICAgIGxhYnMoeCA9ICJPZGRzIHJhdGlvIiwKICAgICAgICAgeSA9ICJQcm9iYWJpbGl0eSBkZW5zaXR5IiwKICAgICAgICAgc3VidGl0bGUgPSAiV29tZW46IFdoaXRlIG9yIEFzaWFuIikgKwogICAgcHViX3RoZW1lX0IKb3JCXzEyX3dvbWVuX1dBX3Bvc3QKYGBgCgpgYGB7cn0KKG9yQl8xMl9tZW5fQkhJX3Bvc3QgfCBvckJfMTJfd29tZW5fQkhJX3Bvc3QpIC8gKG9yQl8xMl9tZW5fV0FfcG9zdCB8IG9yQl8xMl93b21lbl9XQV9wb3N0KQpgYGAKCmBgYHtyfQpnZ3NhdmUoIi4vZ3JhcGhpY3Mvb3JCXzEyX3Bvc3QucGRmIiwgZGV2aWNlID0gInBkZiIsIHdpZHRoID0gOCwgaGVpZ2h0ID0gNSkKYGBgCgojIyMjIyBQaGFzZSAxIHRvIFBoYXNlIDMKCmBgYHtyfQpvckJfMTNfbWVuX0JISV9wb3N0IDwtIGdncGxvdChvcmRfbW1fdGlkeUJfMTMsIGFlcyh4ID0gb3JfbWVuX0JISSkpICsKICAgIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gYWZ0ZXJfc3RhdChkZW5zaXR5KSkpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEsIGNvbG9yID0gImJsdWUiKSArCiAgICBsYWJzKHggPSAiT2RkcyByYXRpbyIsCiAgICAgICAgIHkgPSAiUHJvYmFiaWxpdHkgZGVuc2l0eSIsCiAgICAgICAgIHRpdGxlID0gIk1vZGVsIEIsIFBoYXNlIDEgdG8gUGhhc2UgMyIsCiAgICAgICAgIHN1YnRpdGxlID0gIk1lbjogQmxhY2ssIEhpc3BhbmljLCBvciBJbmRpZ2Vub3VzIikgKwogICAgcHViX3RoZW1lX0IKb3JCXzEzX21lbl9CSElfcG9zdApgYGAKCmBgYHtyfQpvckJfMTNfd29tZW5fQkhJX3Bvc3QgPC0gZ2dwbG90KG9yZF9tbV90aWR5Ql8xMywgYWVzKHggPSBvcl93b21lbl9CSEkpKSArCiAgICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IGFmdGVyX3N0YXQoZGVuc2l0eSkpKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxLCBjb2xvciA9ICJibHVlIikgKwogICAgbGFicyh4ID0gIk9kZHMgcmF0aW8iLAogICAgICAgICB5ID0gIlByb2JhYmlsaXR5IGRlbnNpdHkiLAogICAgICAgICBzdWJ0aXRsZSA9ICJXb21lbjogQmxhY2ssIEhpc3BhbmljLCBvciBJbmRpZ2Vub3VzIikgKwogICAgcHViX3RoZW1lX0IKb3JCXzEzX3dvbWVuX0JISV9wb3N0CmBgYAoKYGBge3J9Cm9yQl8xM19tZW5fV0FfcG9zdCA8LSBnZ3Bsb3Qob3JkX21tX3RpZHlCXzEzLCBhZXMoeCA9IG9yX21lbl9XQSkpICsKICAgIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gYWZ0ZXJfc3RhdChkZW5zaXR5KSkpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEsIGNvbG9yID0gImJsdWUiKSArCiAgICBsYWJzKHggPSAiT2RkcyByYXRpbyIsCiAgICAgICAgIHkgPSAiUHJvYmFiaWxpdHkgZGVuc2l0eSIsCiAgICAgICAgIHN1YnRpdGxlID0gIk1lbjogV2hpdGUgb3IgQXNpYW4iKSArCiAgICBwdWJfdGhlbWVfQgpvckJfMTNfbWVuX1dBX3Bvc3QKYGBgCgpgYGB7cn0Kb3JCXzEzX3dvbWVuX1dBX3Bvc3QgPC0gZ2dwbG90KG9yZF9tbV90aWR5Ql8xMywgYWVzKHggPSBvcl93b21lbl9XQSkpICsKICAgIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gYWZ0ZXJfc3RhdChkZW5zaXR5KSkpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEsIGNvbG9yID0gImJsdWUiKSArCiAgICBsYWJzKHggPSAiT2RkcyByYXRpbyIsCiAgICAgICAgIHkgPSAiUHJvYmFiaWxpdHkgZGVuc2l0eSIsCiAgICAgICAgIHN1YnRpdGxlID0gIldvbWVuOiBXaGl0ZSBvciBBc2lhbiIpICsKICAgIHB1Yl90aGVtZV9CCm9yQl8xM193b21lbl9XQV9wb3N0CmBgYAoKYGBge3J9CihvckJfMTNfbWVuX0JISV9wb3N0IHwgb3JCXzEzX3dvbWVuX0JISV9wb3N0KSAvIChvckJfMTNfbWVuX1dBX3Bvc3QgfCBvckJfMTNfd29tZW5fV0FfcG9zdCkKYGBgCgpgYGB7cn0KZ2dzYXZlKCIuL2dyYXBoaWNzL29yQl8xM19wb3N0LnBkZiIsIGRldmljZSA9ICJwZGYiLCB3aWR0aCA9IDgsIGhlaWdodCA9IDUpCmBgYAoKIyMjIEZhY3VseSBkaWZmZXJlbmNlcwoKT25seSBmb3IgTW9kZWwgQS4KCmBgYHtyfQpwcm9wX2NoYW5nZTEyIDwtIG9yZF9tbV9sb25nX2RpZmZfZ3JvdXBlZEFfMTIgJT4lCiAgICBnZ3Bsb3QoYWVzKHkgPSBmY3RfcmV2KGdyYWRlX2RpZmZfZ3JvdXBlZCksIHggPSBwcm9wKSkgKwogICAgICAgIHN0YXRfaGFsZmV5ZSgpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gImJsdWUiKSArCiAgICBsYWJzKHggPSAiUHJvcG9ydGlvbiBjaGFuZ2UiLAogICAgICAgICB5ID0gIkdyYWRlIiwKICAgICAgICAgdGl0bGUgPSAiTW9kZWwgQSIsCiAgICAgICAgIHN1YnRpdGxlID0gIlBoYXNlIDEgdG8gUGhhc2UgMiIpICsKICAgIHB1Yl90aGVtZQpwcm9wX2NoYW5nZTEyCmBgYAoKYGBge3J9CnByb3BfY2hhbmdlMTMgPC0gb3JkX21tX2xvbmdfZGlmZl9ncm91cGVkQV8xMyAlPiUKICAgIGdncGxvdChhZXMoeSA9IGZjdF9yZXYoZ3JhZGVfZGlmZl9ncm91cGVkKSwgeCA9IHByb3ApKSArCiAgICAgICAgc3RhdF9oYWxmZXllKCkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAiYmx1ZSIpICsKICAgIGxhYnMoeCA9ICJQcm9wb3J0aW9uIGNoYW5nZSIsCiAgICAgICAgIHkgPSAiR3JhZGUiLAogICAgICAgICBzdWJ0aXRsZSA9ICJQaGFzZSAxIHRvIFBoYXNlIDMiKSArCiAgICBwdWJfdGhlbWUKcHJvcF9jaGFuZ2UxMwpgYGAKCmBgYHtyfQpwcm9wX2NoYW5nZTEyICsgcHJvcF9jaGFuZ2UxMwpgYGAKCmBgYHtyfQpnZ3NhdmUoIi4vZ3JhcGhpY3MvcHJvcF9jaGFuZ2UucGRmIiwgZGV2aWNlID0gInBkZiIsIHdpZHRoID0gOCwgaGVpZ2h0ID0gNCkKYGBgCg==